2011-01-20 152 views
0

我不擅長編寫MySQL查詢,所以這個查詢不能正常工作。我想選擇所有的「組」,並通過組中保存的ID獲取組的外部信息,例如組的創建者,最後一個更新人員以及組中的圖像數量。如何在不使用INNER JOIN的情況下連接表?

在此查詢我使用INNER JOIN,但顯然組有沒有圖像在此查詢的arent選擇。我希望查詢能夠選擇所有組,並使用這些ID獲取有關所有組的信息。如果一個組沒有圖像,我希望圖像計數爲0,而不是要忽略的組。

這是當前查詢:

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 

FROM gallery_groups g INNER JOIN 
     users c INNER JOIN 
     users u INNER JOIN 
     gallery_images i 

WHERE g.created_by=c.id AND g.updated_by=u.id AND i.group=g.id $id 
GROUP BY g.name 
ORDER BY g.date_updated DESC, g.name 

我曾嘗試更換INNER與LEFT JOIN連接,右JOIN和OUTER JOIN,但都只是導致SQL錯誤。

感謝您的幫助!

+0

有什麼錯誤? – zerkms 2011-01-20 05:56:03

回答

3

將連接標準與它們所屬的連接放在一起。 既然你是分組不要混用聚集(在列總和/ MAX等)和非聚集(場未在GROUP BY而不是在功能)即使MySQL允許你

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 
FROM gallery_groups g LEFT JOIN 
     users c ON g.created_by=c.id LEFT JOIN 
     users u ON g.updated_by=u.id LEFT JOIN 
     gallery_images i ON i.group=g.id 
WHERE g.id = $id 
GROUP BY g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname, g.updated_by, u.fullname 
ORDER BY g.date_updated DESC, g.name 

通過除圖像計數其他幾乎一切,這可能是更好的只是子查詢

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, 
    IFNULL((
     select COUNT(1) 
     from gallery_images i 
     WHERE i.group=g.id), 0) as image_count 
FROM gallery_groups g LEFT JOIN 
     users c ON g.created_by=c.id LEFT JOIN 
     users u ON g.updated_by=u.id LEFT JOIN 
     gallery_images i ON i.group=g.id 
WHERE g.id = $id 
ORDER BY g.date_updated DESC, g.name 
1

當您在SQL連接兩個表你必須給標準加入的。

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 
FROM gallery_groups g 
    INNER JOIN users c ON g.created_by=c.id 
    INNER JOIN users u ON g.updated_by=u.id 
    INNER JOIN gallery_images i ON i.group=g.id 
GROUP BY g.name 
ORDER BY g.date_updated DESC, g.name 

FROM子句首先執行,並收集查詢返回的所有數據。然後執行GROUP BY和WHERE子句,減少將要返回的行數。最後執行ORDER BY子句,重新排列整個結果集。

內連接和外連接之間的差異是發生不匹配時的行爲。內部連接刪除不匹配的行,外部連接允許不匹配。除非你有理由說明爲什麼需要外連接,否則幾乎總是需要內連接。

相關問題