2011-02-27 52 views
0

我有兩個表:tracklist(trackid artist event date)radded(trackid, user)與關係1到n(trackid是每個表上的鍵)。MySql - 加入問題

我希望通過添加一個名爲exist的新字段來返回整個曲目表,如果每個行的相關軌道的radded表上存在一個用戶(傳遞了查詢結果),則該字段應該爲1或0。

實施例:

曲目列表

*trackid artist event date* 
123  art1 eve1 date1 
321  art2 eve2 date2 
456  art3 eve3 date3 
298  art4 eve4 date4 
565  art5 eve5 date5 

radded

trackid user 
123  luigi 
123  mario 
321  luigi 
298  mario 
298  antonio 

如果我使用路易作爲用戶,輸出必須是:

123 art1 eve1 date1 1 
321 art2 eve2 date2 1 
456 art3 eve3 date3 0 
298 art4 eve4 date4 0 
565 art5 eve5 date5 0 

我該如何做這個查詢?

回答

3

使用LEFT OUTER JOINtracklistradded where user="luigi"。這將從tracklist每一行得到一次,如果它存在,將會把username,或NULL,如果沒有找到合適的用戶名。

然後將用戶名轉換爲1NULL0,並將該列重命名爲exist

SELECT t.trackid, t.artist, t.event, t.date, IF(r.user IS NULL, 0, 1) AS exist 
FROM tracklist t 
LEFT OUTER JOIN (SELECT * from radded where user = "luigi") r 
ON t.trackid = r.trackid 
+0

這正是我以前所做的。但是,這不幸的是不會返回「0」,如果trackid用戶不存在radded ... – markzzz 2011-02-27 13:44:42

+0

是的,'左外部JOIN'。它不工作.. – markzzz 2011-02-27 13:46:52

+0

@markzzz:對不起,你是對的。我更新了答案,這應該工作。使用一個子查詢來獲取luigi-lines。 – Konerak 2011-02-27 13:50:03

2

試試這個:

SELECT tl.trackid, artist, event, date, 
      (r.user is not null) as exists 
    FROM tracklist tl 
LEFT JOIN radded r 
     ON tl.trackid = r.trackid 
     AND r.user = 'luigi' 

的結果應該是:

123 art1 eve1 date1 1 
321 art1 eve1 date1 1 
456 art1 eve1 date1 0 
298 art1 eve1 date1 0 
565 art1 eve1 date1 0 

(編輯只得到每個軌道單行)

也確保有一個指數涵蓋radded(trackid, user),radded(user),tracklist(trackid)radded(trackid)

+0

是的,但實際上我想每個trackid的每一行。我不能應用羣組或按此查詢明確.... – markzzz 2011-02-27 13:45:46

+0

@markzzz:看到我更新的答案 – knittl 2011-02-27 13:57:05

2
SELECT 
    t.trackid, 
    t.artist, 
    t.event, 
    t.date, 
    MAX(CASE r.user WHEN 'luigi' THEN 1 ELSE 0 END) AS flag 
FROM tracklist t 
    LEFT JOIN radded r ON t.trackid = r.trackid 
GROUP BY 
    t.trackid, 
    t.artist, 
    t.event, 
    t.date 

編輯:它是如何工作的一些解釋。

這裏有一個類似的腳本不使用分組:

SELECT 
    t.trackid, 
    t.artist, 
    t.event, 
    t.date, 
    CASE r.user WHEN 'luigi' THEN 1 ELSE 0 END AS flag 
FROM tracklist t 
    LEFT JOIN radded r ON t.trackid = r.trackid 

它的輸出將是:

trackid artist event date flag 
------- ------ ----- ---- ---- 
123  art1 eve1 date1 1 
123  art1 eve1 date1 0 
321  art2 eve2 date2 1 
456  art3 eve3 date3 0 
298  art4 eve4 date4 0 
298  art4 eve4 date4 0 
565  art5 eve5 date5 0 

中的重複raddedtrackids,相應地重複在此列表中。爲了擺脫重複我們使用GROUP BY。 MAX用於獲取flag的正確值。

+0

這似乎工作!正確的語法是'MAX(CASE r.user WHEN'djfonplaz'THEN 1 ELSE 0 END)AS flag'。但我真的不明白GROUP BY如何得到正確的值... – markzzz 2011-02-27 13:49:49

+0

@markzzz:你說的是正確的語法,解決了這個問題,並補充了一些解釋。 – 2011-02-27 14:02:48

+0

對!感謝您的解釋和解決方案:)可能很好理解哪個更好你的解決方案和Konerak之一:) – markzzz 2011-02-27 14:05:30