2011-02-27 39 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