MySql - 加入麻烦

时间:2011-02-27 13:38:10

标签: mysql

我有两个表: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

我该如何进行此查询?

3 个答案:

答案 0 :(得分:3)

使用LEFT OUTER JOINtracklist的{​​{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的正确值。