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

时间:2018-07-06 14:59:08

标签: mysql sql select null

我试图在一个查询中返回不同的结果,特别是查询使用ranking字段返回特定competition的{​​{1}},现在有时该表可以具有该字段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 ) 可用,但如果此字段为group.id,则不会返回任何内容,这是NULL表数据的一个小示例:

league_ranking

如果我搜索为| round_id | group_id | team_id 5 3 1045 5 3 1046 6 NULL 1047 6 NULL 1048 5,将返回前两个记录,但是如果我搜索round.id 6,则不会返回任何记录。如果没有关联round.id,如何构造查询以返回结果?

1 个答案:

答案 0 :(得分:11)

null不是值,而是它的不足。 null = null返回null,而不返回true,因此对于没有ID的组,此查询将不起作用。

不过,您可以使用<=>而不是=来将两个null视为相等:

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
)