【问题标题】:MySQL: INNER JOIN crashes 2 LEFT JOINs if one of them returns NULLMySQL:如果其中一个返回 NULL,则 INNER JOIN 会导致 2 个 LEFT JOIN 崩溃
【发布时间】:2013-05-13 03:20:44
【问题描述】:

查询中:

SELECT
    i.id, i.title, i.description,
    cities.name as city,
    GROUP_CONCAT(DISTINCT station.name) as station,
    GROUP_CONCAT(DISTINCT p.url) as photos
FROM
    items i
INNER JOIN
    cities ON cities.id = i.city_id
LEFT JOIN
    item_photos p ON p.item_id = i.id
LEFT JOIN
    item_stations s ON s.item_id = i.id
INNER JOIN
    stations ON stations.id = s.station_id
WHERE i.id = ?
LIMIT 1

如果表 item_stations 中的行不存在,则两个 LEFT JOIN 都有效:返回照片,为车站返回 NULL。但在这种情况下使用 INNER JOIN 查询将为照片和电台返回 NULL。如果 item_stationss.item_id = i.id 中不需要的行,我应该如何重写查询以说 INNER JOIN 不加入表?

【问题讨论】:

    标签: mysql left-join inner-join


    【解决方案1】:

    如果您确实需要在 item_stationsstations 表之间进行 INNER JOIN,那么您可能需要考虑在子查询中使用 INNER JOIN:

    SELECT
        i.id, i.title, i.description,
        cities.name as city,
        GROUP_CONCAT(DISTINCT s.name) as station,
        GROUP_CONCAT(DISTINCT p.url) as photos
    FROM items i
    INNER JOIN cities 
      ON cities.id = i.city_id
    LEFT JOIN item_photos p 
      ON p.item_id = i.id
    LEFT JOIN
    (
      select item_id, name
      from item_stations s 
      INNER JOIN stations 
        ON stations.id = s.station_id
    ) 
      ON s.item_id = i.id
    WHERE i.id = ?
    LIMIT 1
    

    否则我建议在两者之间使用 LEFT JOIN:

    SELECT
        i.id, i.title, i.description,
        cities.name as city,
        GROUP_CONCAT(DISTINCT stations.name) as station,
        GROUP_CONCAT(DISTINCT p.url) as photos
    FROM items i
    INNER JOIN cities 
      ON cities.id = i.city_id
    LEFT JOIN item_photos p 
      ON p.item_id = i.id
    LEFT JOIN item_stations s 
      ON s.item_id = i.id
    LEFT JOIN stations 
      ON stations.id = s.station_id
    WHERE i.id = ?
    LIMIT 1
    

    【讨论】:

    • 哦,谢谢!我尝试使用 LEFT JOIN 而不是 INNER JOIN,它有效!
    猜你喜欢
    • 2012-08-10
    • 2014-11-15
    • 2018-07-10
    • 2019-04-16
    • 2015-01-13
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多