2017-10-25 14 views
1

JOIN을 통해 다른 테이블에서 값을 선택하는 쿼리가 있습니다. 하지만 한 테이블이 다른 이름으로 다시 참여해야하기 때문에 문제가있는 것 같지만 어떻게 든 작동하지 않습니다.조인을 두 개 사용하여 여러 테이블 값 선택

소셜 네트워크 strucutre에 따라 예 :

표 "사용자"

+--------+-----------+ 
| userid | username | 
+--------------------| 
| 1  | userOne | 
| 2  | userTwo | 
| 3  | userThree | 
+--------+-----------+ 

표 "게시물"

+--------+---------+-------------------------------+ 
| postid | userid | text       | 
+--------------------------------------------------| 
| 102 | 1  | "Haha i'm User one"   | 
| 103 | 1  | "And User one is the best" | 
| 104 | 3  | "I'm having fun with user two"| 
+--------+---------+-------------------------------+ 

표 "usertags"

+--------+---------------+ 
| postid | tagged_userid | 
+------------------------| 
| 104 | 2    | 
+--------+---------------+ 

이것은입니다. 내 쿼리 :

SELECT posts.postid, 
    posts.userid, 
    posts.text, 
    users.username, 
    IFNULL(GROUP_CONCAT(DISTINCT usertags.tagged_userid SEPARATOR ','), NULL) as 
taggedusers_id, 
    IFNULL(GROUP_CONCAT(DISTINCT taggedusers.fullname SEPARATOR ','), NULL) as 
taggedusers_name, 
    FROM posts 
JOIN users ON posts.userid = users.userid 
LEFT JOIN usertags ON posts.postid = usertags.postid 
LEFT JOIN users as taggedusers ON usertags.tagged_userid = users.userid 
GROUP BY posts.postid 
ORDER BY posts.postid DESC 

그리고 내가 얻을 결과입니다 :

+--------+---------+---------------------------------------------------------------------+ 
| postid | userid | text       | username   | taggedusers_id | 
+-----------------------------------------------------------------------|----------------| 
| 102 | 1  | "Haha i'm User one"   | userOne   | NULL   | 
| 103 | 1  | "And User one is the best" | userOne   | NULL   | 
| 104 | 3  | "I'm having fun with user two"| userThree   | 2 
+--------+---------+-------------------------------+--------------------+----------------+ 

문제 :가 열 'taggedusers_name'가 나타 하지만 항상 NULL이다. 태그가 지정된 사용자의 사용자 이름을 표시하고 싶습니다. 이와 같이 하지만, 전체, 큰 출력 그래서

+---------------+-------------------+ 
| taggeduser_id | taggeduser_name | 
+-----------------------------------| 
| 2    | userTwo   | 
| 2,3   | userTwo,userThree | 
| NULL   | NULL    | 
+---------------+-------------------+ 

에서, 어떻게 이런 일이 가능 할까? 여러 개의 SELECT 문을 만들어야합니까? 나는 그것을 이미 시도했지만 이것 역시 실패했다 :/ 도움을 청할 것이다!

+0

샘플 데이터가 원하는 결과와 일치하지 않으며 쿼리에서 누락 된 열이 없어도 스키마가 완성되지 않습니다. –

+0

관련 없음, IFNULL (***, NULL)의 핵심은 무엇입니까? 기본적으로 말하면, NULL이면 NULL로 설정합니다. 내가 누락 된 혜택이 없다면 중복 된 것처럼 보입니다. – kchason

+1

@KeithChason은 아마도'IFNULL (***, '')' –

답변

0

별칭없이 users을 다시 참조하고 있습니다. users은 이미 암시 적으로 INNER JOIN (이 질문은 What is the default MySQL JOIN behaviour, INNER or OUTER? 참조)이므로 taggedusers 테이블은 작성자가 태그가 지정된 사용자 ID와 동일한 조건을 충족해야합니다. 이를 방지하기 위해

SELECT posts.postid, 
    posts.userid, 
    posts.text, 
    users.username, 
    IFNULL(GROUP_CONCAT(DISTINCT usertags.tagged_userid SEPARATOR ','), NULL) as 
taggedusers_id, 
    IFNULL(GROUP_CONCAT(DISTINCT taggedusers.fullname SEPARATOR ','), NULL) as 
taggedusers_name, 
FROM 
    posts 
JOIN 
    users 
    ON posts.userid = users.userid 
LEFT JOIN 
    usertags 
    ON posts.postid = usertags.postid 
LEFT JOIN 
    users as taggedusers 
    ON usertags.tagged_userid = taggedusers.userid -- this is (I assume) what you meant 
    -- ON usertags.tagged_userid = users.userid -- this is your problem 
GROUP BY 
    posts.postid 
ORDER BY 
    posts.postid DESC 

한 가지 방법은 항상 별칭 테이블에있다; 이 경우 '저자'또는 그와 비슷한 것으로 별칭을 지정할 수 있습니다 (users).

고유 ID에 동일한. 제 점이없는 이유는 올바르게 결합 된 테이블에 있었던 것입니다.

+0

을 의미합니다. 이걸 깨닫는 시간을 많이 절약 해 줬어. – Olli