LIMIT和JOIN的奇怪的MySQL问题

时间:2017-01-03 21:03:04

标签: mysql

我有这个问题:

SELECT          s.* 
FROM            @mcmodlist_servers s
LEFT OUTER JOIN @mcmodlist_tag_server ts 
ON              ts.server_id = s.id

(不介意@mcmodlist_位,它由PHP转换为实际的表名。)

如上所述执行时,它会提供5条记录的结果,但是当我添加LIMIT 10时,它突然返回4.

但等等,它变得更好:如果我将其更改为LIMIT 12,则会突然再次出现5条记录(LIMIT 11仍会返回4)。

左外层只有在匹配记录时才会加入,否则返回null,对吗?

为什么LIMIT表现得像这样?没有JOIN子句

,它可以正常工作

1 个答案:

答案 0 :(得分:1)

我认为如果你在MySQL客户端运行查询,限制为10,你会发现它实际上在结果集中返回了10行。

我怀疑@mcmodlist_tag_server中有多行,server_id@mcmodlist_servers的行匹配。当有多个匹配的行时,您将获得"重复"来自@mcmodlist_servers的行。

鉴于@mcmodlist_tag_server表没有返回任何列,并且这是一个OUTER连接,它根本不清楚为什么这个表将被包含在查询中。

不,LEFT JOIN并不意味着你所说的意思。

问:左外层只有在匹配记录时才加入,否则返回null,对吗?

答:没有。这不是LEFT JOIN的意思。 LEFT JOIN将返回左侧表格中的所有行,以及右侧的匹配行,就像INNER JOIN一样。但是使用LEFT JOIN,如果左侧的一行没有从右侧开始匹配的行,则返回左侧的行。是的,当发生这种情况时,右侧表中的列将包含NULL占位符。

LIMIT子句适用于结果集中返回的总行数。它并不意味着给定表中不同行的数量。