Mysql用空行加入4个表

时间:2016-06-18 03:38:49

标签: mysql join

我尝试加入4个表,

  1. item_list
  2. item
  3. item_image
  4. item_table
  5. 问题是, 我想在项目表中有行的项目,很容易,我可以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的行, 所以,如果一个没有图像或表的项目,它就不会被提取。

2 个答案:

答案 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中,它们应该有非常相似的效果。