2011-04-25 4 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($r = $q->fetch_array(MYSQLI_ASSOC)) : 
    echo $r['u.f_name']; 
    echo $r['u1.f_name']; 
endwhile; 

답변

2

당신의 JOIN 절대적으로 올바른 것 같다 . 유일한 문제는 테이블 user을 두 번 합친 것이므로 동일한 이름을 가진 열이 있습니다 (예 : f_name). 데이터베이스는 다른 열 (그러나 임의의 이름)을이 열에 할당합니다. 그런 다음

$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 .... ") 

: 당신은 AS 키워드이 동작을 재정의 할 수 있습니다

while($r = $q->fetch_array(MYSQLI_ASSOC)) : 
    echo $r['user_f_name']; 
    echo $r['target_f_name']; 
endwhile; 

을 그리고 난 당신이 (내부) JOIN들과 LEFT JOIN의를 대체 할 수 있다고 생각합니다. 존재하지 않는 사용자 ID (id_u)를 참조하는 id_user 또는 id_target 값이없는 한.

+0

yeehh thanks alot :) – tonoslfx

-1

에 대한 방법 : SELECT * 바우처로부터 id_user에서 사용자를 가입 = id_u

여전히

간단한 : 바우처 FROM

SELECT *, 사용자 WHERE id_user = id_u

+0

그는 id_user와 id_target (둘 다 다른 사용자)을 "해결"하려고합니다. – ChrisWue

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

+0

@ boyee007 : 작성한 정확한 쿼리는 무엇입니까? ..... –

+0

@its 위의 쿼리. id_user와 id_target, 두 명의 다른 사용자의 이름을 반향시키고 싶습니다. – tonoslfx

1

그것을 위치 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