Mysql(LEFT)JOIN如何解释这种行为?

时间:2012-02-17 08:27:27

标签: mysql sql

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值

之外的相同行

3 个答案:

答案 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查询的运行与编写完全相同,对于此类型的联接,您可以针对ONWHERE中的相同条件获得不同的结果。

如果您想为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不增加。