[英]mysql joining two table
table user:
id_u* f_name l_name
----------------------
1 andi mitchel
2 sarah bench
3 kirsty larx
table voucher:
id_v* id_user id_target
1 1 2
2 2 3
很困惑如何用兩個外鍵加入這些表
$db->query("SELECT * FROM voucher v
LEFT JOIN user u ON u.id_u = v.id_user
LEFT JOIN user u1 ON u1.id_u = v.id_target
WHERE .... ")
回聲while循環...並且什么都不返回?
while($r = $q->fetch_array(MYSQLI_ASSOC)) :
echo $r['u.f_name'];
echo $r['u1.f_name'];
endwhile;
你的JOIN
似乎絕對正確。 唯一的問題是您已經連接了兩次表user
,因此您有相同名稱的列(如f_name
)。 數據庫將為這些列分配不同(但任意)的名稱。 您可以使用AS
關鍵字覆蓋此行為:
$db->query("SELECT v.*
, u.f_name AS user_f_name
, u.l_name AS user_l_name
, ta.f_name AS target_f_name
, ta.l_name AS target_l_name
FROM voucher v
LEFT JOIN user u ON u.id_u = v.id_user
LEFT JOIN user ta ON ta.id_u = v.id_target
WHERE .... ")
然后:
while($r = $q->fetch_array(MYSQLI_ASSOC)) :
echo $r['user_f_name'];
echo $r['target_f_name'];
endwhile;
我認為你可以用(內部) JOIN
替換LEFT JOIN
。 除非您有id_user
或id_target
值引用不存在的id_u
( id_u
)。
您似乎要求所有在憑證表中的人,無論他們處於位置1(用戶)還是位置2(目標)......然后,顯示該人的姓名。
此查詢對每個可能的人及其位置基礎(通過WhichPosition)進行預查詢。
SELECT STRAIGHT_JOIN
AllVoucherUsers.WhatPosition,
u.*
FROM
( select distinct
v.id_user,
'1' as WhatPosition
from voucher v
union select distinct
v.id_target as id_user,
'2' as WhatPosition
from voucher v
) AllVoucherUsers
join users u
on AllVoucherUsres.id_user = u.id_u
如果你只想要一個給定人的一個實例 - 無論他們的位置如何,只需刪除所有“WhatPosition”引用的實例......
SELECT STRAIGHT_JOIN
u.*
FROM
( select distinct
v.id_user
from voucher v
union select distinct
v.id_target as id_user
from voucher v
) AllVoucherUsers
join users u
on AllVoucherUsres.id_user = u.id_u
SELECT * FROM voucher v
LEFT JOIN user u ON u.id_u = v.id_user OR u.id_u = v.id_target
WHERE ....
怎么樣:SELECT * FROM憑證JOIN用戶ON id_user = id_u
更簡單:
SELECT * FROM憑證,用戶WHERE id_user = id_u
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.