左连接查询未按计划进行

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 成本更高

SQL Server 2008 - 连接导致性能下降

具有三个未索引联合表和左连接的 MySQL 查询使数据库负担过重

对两个 MySQL 查询执行左外连接?

求助,SQlServer用外连接查询出未匹配的数据