我有两个表:tracklist(trackid artist event date)
和radded(trackid, user)
,关系为1到n(trackid是每个表上的键)。
我想通过添加一个名为exist
的新字段来返回整个tracklist表,如果用户(通过查询)存在于每个相关trackid的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
如果我使用 luigi 作为用户,输出必须是:
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
我该如何进行此查询?
答案 0 :(得分:3)
使用LEFT OUTER JOIN
到tracklist
的{{1}}。这将使radded where user="luigi"
中的每一行都恰好一次,如果存在则会tracklist
,如果找不到合适的用户名,则会username
。
然后将用户名转换为NULL
,或将1
转换为NULL
,并将列重命名为0
。
exist
答案 1 :(得分: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)
答案 2 :(得分: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
trackids
中重复的radded
会在此列表中重复出现。为了摆脱重复,我们使用GROUP BY。 MAX
用于获取flag
的正确值。