2011-04-25 136 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