我有两个表: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'的值(如果在所有都有匹配)。
请指教。提前谢谢。
答案 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'