如何在同一个查询中返回不同的结果?

jid*_*dic 10 mysql sql null select

我试图在一个查询中返回不同的结果,特别是查询返回ranking一个特定的competition 使用round.id字段,现在有时候这个表可以有字段值group.id,如果是这样我只需要返回具有group.id最小值的排名,所以我创建了这个设计:

SELECT l.*,
t.name as team_name,
r.name AS rank_name,
r.color AS rank_color
FROM league_ranking l
LEFT JOIN team t ON l.team_id = t.id
LEFT JOIN competition_ranks r ON l.rank = r.id
INNER JOIN competition_groups g 
WHERE l.round_id = :round_id
AND l.group_id = (
  SELECT MIN(l2.group_id)
  FROM league_ranking l2
  WHERE l2.round_id = :round_id
)
Run Code Online (Sandbox Code Playgroud)

这个工作如果排名记录有group.id可用,但是如果这个字段NULL什么也不会返回,表示league_ranking数据的一个小例子:

| round_id | group_id | team_id
     5         3         1045
     5         3         1046
     6         NULL      1047
     6         NULL      1048
Run Code Online (Sandbox Code Playgroud)

如果我搜索为round.id5,将返回前两个记录,但如果我搜索round.id6,则不会返回任何内容.如果没有group.id关联,我如何构造我的查询以返回结果?

Mur*_*nik 11

null不是价值,而是缺乏价值.null = null返回null,不是true,因此对于没有id的组,此查询将不起作用.

但是,您可以使用<=>而不是=将两个nulls 评估为相等:

SELECT l.*,
t.name as team_name,
r.name AS rank_name,
r.color AS rank_color
FROM league_ranking l
LEFT JOIN team t ON l.team_id = t.id
LEFT JOIN competition_ranks r ON l.rank = r.id
INNER JOIN competition_groups g 
WHERE l.round_id = :round_id
AND l.group_id <=> ( -- <=> used here instead of =
  SELECT MIN(l2.group_id)
  FROM league_ranking l2
  WHERE l2.round_id = :round_id
)
Run Code Online (Sandbox Code Playgroud)

  • @jidic - "重复"?我期望球队1047和1048; 你是否重复了这两个? (3认同)
  • 我尝试了你的查询,但是我得到了一个奇怪的结果,特别是最终结果显示重复的记录,为什么会发生这种情况呢?谢谢 (2认同)
  • @jidic Rick James比我更好地解释了这一点 - 这轮中有两支队伍的"null"组ID,所以两者都归还了. (2认同)
  • @RickJames这是实际的结果:https://pastebin.com/CcatzyR6我检查数据库,特别是我试图查看是否有重复记录,但表中只显示了4条带有round_id 5和group_id 3的记录 (2认同)
  • 好吧似乎工作,我必须添加GROUP_BY以避免重复,不要为什么如果可能避免在您的解决方案中添加GROUP_BY并且不会得到重复.我还不能分配赏金,因为请告诉我等待19个小时 (2认同)
  • @jidic你可以分配赏金,这样这个问题就会脱离特色页面.:) (2认同)