LEFT JOIN
SET @foo:=0;
SELECT @foo
FROM test t1
LEFT JOIN test t2 ON t2.id=t1.id AND (@foo:=@foo+1);
打印0,0,0,0,0,0,0 ......
,但加入
SET @foo:=0;
SELECT @foo
FROM test t1
JOIN test t2 ON t2.id=t1.id AND (@foo:=@foo+1);
打印1,2,3,4,5,6 ......
有人知道吗?谢谢!
UPD。此查询生成除@foo值
之外的相同行答案 0 :(得分:1)
会话变量的分配在ON
子句中不起作用。
您认为INNER JOIN的@foo递增的原因是优化器将您的查询运行为:
SET @foo:=0;
SELECT @foo
FROM test t1
JOIN test t2
WHERE t2.id=t1.id AND (@foo:=@foo+1);
使用EXPLAIN SELECT...
您应该在额外列中看到using where
。
您还可以使用EXPLAIN EXTENDED SELECT...
然后使用SHOW WARNINGS
来查看优化程序如何运行您的查询。
在您的情况下,LEFT JOIN
查询的运行与编写完全相同,对于此类型的联接,您可以针对ON
和WHERE
中的相同条件获得不同的结果。
如果您想为LEFT JOIN
增加@foo,请使用:
SET @foo:=0;
SELECT @foo
FROM test t1
LEFT JOIN test t2 ON t2.id=t1.id
WHERE @foo:=@foo+1
答案 1 :(得分:0)
也许,如果第一个返回false,则mysql引擎不检查AND序列中的第二个条件,这可能是LEFT JOIN
答案 2 :(得分:0)
您是否提到从表t1中选择一些其他数据?
两个操作之间的区别可能是LEFT JOIN的行为。 LEFT JOIN尝试根据规则加入。它从左侧数据集中选取一条记录,并尝试从右侧数据集中加入其他数据。如果没有匹配,则右手数据集的所有列都设置为NULL并加入。正常JOIN会跳过不能进行JOIN的记录。
id
--
1
2
3
4
LEFT JOIN选择记录a,尝试LEFT JOIN其他记录。 ID不是ID的每条记录都会导致失败联接。但LEFT JOIN不会跳过这些记录,因为所需的左侧数据(记录a)可用。因此,结果记录用连接记录填充NULL,而foo不增加。