2013-06-25 200 views
1

表1:需要帮助左加入MySQL查询

name | map_id | reg_id 
abc | 1  | 5 
pqr | 2  | 5 
xyz | 3  | 5 

表2:

map_id | map_name | is_deleted 
1  | map1  | 0 
2  | map2  | 0 

我的SQL查询:

SELECT * 
FROM table1 t1 
     LEFT JOIN table2 t2 
       ON t1.map_id = t2.map_id 
WHERE t1.reg_id = 5 
     AND t2.is_deleted = 0 

什么上面查询的作用是阻止我从在表1中检索map_id = 3的记录。

我如何实现这个以及'is_deleted检查'如果记录存在table2中。

在此先感谢。

回答

3

您需要的is_deleted检查移到JOIN:

select t1.name, t1.map_id, t1.reg_id, -- replace select * with columns 
    t2.map_name, t2.is_deleted 
from table1 t1 
left join table2 t2 
    on t1.map_id = t2.map_id 
    and t2.is_deleted = 0 
WHERE t1.reg_id = 5; 

SQL Fiddle with Demo。您当前的查询导致LEFT JOIN的行为类似于INNER JOIN,因为您将is_deleted作为WHERE子句的一部分。如果将它移动到JOIN,那么您将返回table2中具有is_deleted=0的行,并且您仍将返回table1的所有行,其中reg_id=5

+0

感谢您的回复,看来这将工作。我会在我的应用程序中执行此操作并检查。 – jospratik

+0

是的,因为'和t2.is_deleted = 0'子句正在杀死map_id = 3记录。左连接包含该记录,但“t2.is_deleted”为空。将该条件移至连接条件是执行此操作的正确方法。 – criticalfix