我有这个问题:
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
子句
答案 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
子句适用于结果集中返回的总行数。它并不意味着给定表中不同行的数量。