我尝试加入4个表,
问题是, 我想在项目表中有行的项目,很容易,我可以INNER JOIN两者, 但其余的图像和表格,我不在乎项目是否有图像或表格,所以我使用LEFT JOIN。
这是关系:
(item_list) - 一对多 - (项目)
(item_list) - 一对多 - (item_image)
(item_list) - 一对多 - (item_table)
所以这个查询:
SELECT * FROM item_list
INNER JOIN item ON item.item_list_id = item_list.id
LEFT JOIN item_image ON item_image.item_list_id = item_list.id
LEFT JOIN item_table ON item_table.item_list_id = item_list.id
WHERE item_list.is_featured = '1'
AND item_table.is_deleted = '0'
AND item.is_deleted = '0'
AND item_image.is_deleted = '0'
AND item_list.is_deleted = '0'
AND item_table.language_id = '1'
AND item.language_id = '1'
ORDER BY item_list.id DESC
并且此查询仅返回具有ALL OF THEM的行, 所以,如果一个没有图像或表的项目,它就不会被提取。
答案 0 :(得分:1)
AND( item_image.is_deleted ='0'或item_image.is_deleted为空)AND item_list.is_deleted ='0'AND( item_table.language_id ='1'或item_table.language_id为空)
答案 1 :(得分:1)
您遇到的问题是WHERE子句中的条件限制了结果。
对于您可选择的表,您应该将这些条件移动到FROM子句的ON部分。
SELECT * FROM item_list
INNER JOIN item ON item.item_list_id = item_list.id
LEFT JOIN item_image ON item_image.item_list_id = item_list.id
AND item_image.is_deleted = '0'
LEFT JOIN item_table ON item_table.item_list_id = item_list.id
AND item_table.is_deleted = '0'
AND item_table.language_id = '1'
WHERE item_list.is_featured = '1'
AND item.is_deleted = '0'
AND item_list.is_deleted = '0'
AND item.language_id = '1'
ORDER BY item_list.id DESC
这是因为WHERE子句适用于连接中的每个记录,无论它是否带来数据。但似乎您实际上只想在某些条件下过滤掉这些数据。
一种方法是有条不紊地检查那些,正如@Dhiraj Katekar建议的那样,但你也可以按照我的建议将这些条件移到JOIN中,它们应该有非常相似的效果。