2011-04-25 196 views
0
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 

很困惑如何加入這些表的兩個外鍵的MySQL連接兩個表

$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; 

回答

2

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; 

我想你可以替換LEFT JOIN s的(內部)JOIN秒。除非您有id_userid_target值引用不存在的用戶標識(id_u)。

+0

yeehh非常感謝:) – tonoslfx 2011-04-26 18:30:48

-1

怎麼樣:從憑證 SELECT *加盟的ON id_user = id_u

簡單一些:

SELECT * FROM憑證,用戶WHERE id_user = id_u

+0

他想「解析」id_user和id_target(兩者都是不同的用戶) – ChrisWue 2011-04-25 11:19:57

0
SELECT * FROM voucher v 
    LEFT JOIN user u ON u.id_u = v.id_user OR u.id_u = v.id_target 
    WHERE .... 
+0

我試過那個,但還是什麼也沒有返回。以及如何回顯id_user和id_target用戶的結果? – tonoslfx 2011-04-25 11:27:24

+0

@ boyee007:你能告訴我什麼是你寫的確切的查詢..... – 2011-04-25 11:39:10

+0

@its上述查詢。我想回顯名稱id_user和id_target,這兩個不同的用戶:) – tonoslfx 2011-04-25 11:41:24

1

它看起來你要求所有處於憑證表中的人員,無論他們處於職位1(用戶)還是職位2(目標)......然後顯示該人員的姓名。

該查詢對每個可能的人及其位置基礎(通過WherePosition)進行預查詢。

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