2013-05-17 47 views
0

查詢:MySQL的:INNER JOIN崩潰2 LEFT JOIN的,如果他們中的一個將返回NULL

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爲照片和電臺。我應該如何重寫查詢以說INNER JOIN不要連接表,如果item_stations中沒有需要的行s.item_id = i.id

回答

1

如果你真的需要做的內蒙古item_stationsstations表之間的連接,那麼你可能要考慮使用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 
+0

哦,謝謝!我試過使用LEFT JOIN而不是INNER JOIN,它工作正常! – mikatakana

+0

@mikatakana我很高興現在爲你工作。 – Taryn