左连接查询未按计划进行
Posted
技术标签:
【中文标题】左连接查询未按计划进行【英文标题】:Left join query isn't going as planned 【发布时间】:2016-01-11 21:33:51 【问题描述】:我目前有一个查询应该执行以下操作:
它在“Tafel”表中检查“最大玩家数量”是多少。然后它会转到“RoundRegistered”表,看看是否有人已经注册到该表。
它现在所做的是:它检查是否有一个“tafel”还没有装满。如果是这种情况,它会返回第一个,所以如果有更多它不关心它们,它只需要第一个。
但这是我的问题:如果“RoundRegistered”表中没有至少 1 条记录,它将找不到任何“Tafel”记录。所以我想做的是左连接,所以它仍然会在相同的限制下返回一个“Tafel”记录。唯一阻止它的东西(我认为)是 HAVING..
SELECT T.* FROM TAFEL AS T
JOIN RoundRegistration AS RR ON RR.TafelID = T.ID
WHERE RR.RONDE = 1
GROUP BY T.ID
HAVING COUNT(RR.ID) < T.Max_Aantal_spelers
LIMIT 1
有人知道吗? 谢谢。
【问题讨论】:
该查询中没有LEFT
。
@philipxy 是的,因为 LEFT 连接不返回任何内容。可能是因为 HAVING。
你需要一个左连接来获取没有出现在 RoundRegistration 中的表的行(对于让步轮)。
现在您似乎在告诉我们 RoundRegistration 包含不同锦标赛和不同回合的注册数据。表中的候选键(PRIMARY KEY 和/或 UNIQUE NOT NULL)是什么?请显示示例表输入、查询和所需输出。如果可以的话,通过在每个表中和结果中来说明行的状态。
【参考方案1】:
尝试左连接
SELECT T.* FROM TAFEL AS T
LEFT JOIN RoundRegistration AS RR ON RR.TafelID = T.ID
WHERE RR.RONDE = 1
GROUP BY T.ID
HAVING COUNT(RR.ID) < T.Max_Aantal_spelers
LIMIT 1
如果没有 'LEFT' 子句,您将在哪里执行 'INNER JOIN'
【讨论】:
【参考方案2】:WHERE
子句正在撤消LEFT JOIN
。将条件移至ON
子句:
SELECT T.*
FROM TAFEL T LEFT JOIN
RoundRegistration RR
ON RR.TafelID = T.ID AND RR.RONDE = 1
GROUP BY T.ID
HAVING COUNT(RR.ID) < T.Max_Aantal_spelers
LIMIT 1
【讨论】:
我添加了“AND RR.ToernooiID = 4”,但它返回了“ToernooiID”为 1 的行。xd 所以 AND 似乎不起作用。 @ThomasVieveen 。 . .我不完全理解你的评论。如果您添加该条件,那么您不应该在结果集中看到这些值。以上是关于左连接查询未按计划进行的主要内容,如果未能解决你的问题,请参考以下文章
默认情况下,条件使用“内连接”而不是“左连接”方法使我的查询工作不是我计划的方式
SQL 联合优化为左连接,速度更快,但查询计划表示 I/O 成本更高