Mysql - where子句中的左连接问题

时间:2015-02-04 17:08:25

标签: mysql

我有两个表:activities和activity_images,外键约束是:

activities.id = activitiy_images.activity_id

现在有些活动有图像,有些没有,这对于特定的活动来说。对于activity_images,可能没有条目。

我想默认获取所有数据,无论activity_images中存在哪些数据。

以下是我的询问:

select a.*,a.id as 'activity_id',b.* 
   from activities a 
   left join activity_images b on a.id = b.activity_id 
   where b.image_type='main' LIMIT 0, 9

问题在于输出。上面的查询只给出了匹配行的数据,其中b.image_type ='main'。它不输出activity_images中没有条目的行。

我想要所有行,但同时我想确保b.image_type ='main',因为image_type还有其他值,我只想抓取image_type ='main'的值(如果在所有都有匹配)。

请指教。提前谢谢。

3 个答案:

答案 0 :(得分:1)

select a.*,a.id as 'activity_id',b.* 
   from activities a 
   left join activity_images b on a.id = b.activity_id 
   where b.image_type='main' OR b.image_type IS NULL
 LIMIT 0, 9

这会做你想要的吗?

在这种情况下,我建议将image_type设置为非空列,否则您可能会获得具有匹配行的数据,但image_type实际上设置为null。

答案 1 :(得分:0)

尝试子查询。这将仅使用您的首选图像类型预先选择活动图像表中的行,并仍然会从活动表中选择所有内容:

SELECT a.*,b*
FROM activities a 
    LEFT JOIN (
        SELECT * FROM activity_images WHERE image_type = 'main'
    ) b ON a.id = b.activity_id;
SELECT * FROM activity_images WHERE image_type = 'main' a;

答案 2 :(得分:0)

WHERE子句中的条件适用于已连接的表格时,它基本上被视为INNER JOIN

处理此问题的正确方法是将条件移至ON子句:

SELECT a.*, a.id as 'activity_id', b.* 
   FROM activities a 
   LEFT JOIN activity_images b
     ON b.activity_id = a.id
     AND b.image_type = 'main'