2012-05-05 50 views
1

我有表的定義如下圖所示獲得從另一個表COUNT(*):我如何使用LEFT JOIN的MySQL

  • 廣場
    (ID,姓名)
  • 審查
    (ID,用戶ID,placeid)
  • 收藏
    (ID,用戶ID,placeid)
  • 照片
    (ID,網址placeid)
    其中placeid是外鍵Place表的ID。

該表,我想獲得這樣的信息:
- placeid, place name, totalReview, totalFavorite, totalPhoto.

我stucked。目前我的進度我可以從1個表中獲得信息,就像我可以通過使用這個mysql語句知道totalReview的地方一樣: SELECT p.*, count(r.id) as totalReview from Place p left join Review r on p.id = r.placeid group by p.id。 但是,我不知道如何可以導出totalFavorite和totalPhoto。

回答

4

您需要單獨聚合每個表。這裏有一個解決方案:

SELECT p.*, 
     totalreview, 
     totalfavorite, 
     totalphoto 
FROM place p 
     LEFT OUTER JOIN (SELECT placeid, 
           Count(*) AS totalReview 
         FROM review 
         GROUP BY placeid) r 
        ON p.placeid = r.placeid 
     LEFT OUTER JOIN (SELECT placeid, 
           Count(*) AS totalFavorite 
         FROM favorite 
         GROUP BY placeid) f 
        ON p.placeid = f.placeid 
     LEFT OUTER JOIN (SELECT placeid, 
           Count(*) AS totalPhoto 
         FROM photo 
         GROUP BY placeid) ph 
        ON p.placeid = ph.placeid 
+0

通過使用您的解決方案(LEFT JOIN)與Ehsan解決方案[下面](http://stackoverflow.com/a/10458566/476917),性能如何?我不知道這個解決方案可以在沒有LEFT JOIN的情況下解決。 –

+0

+1是的,謝謝你指出我的回答是錯誤的。不要忘記外部選擇中的totalFavorite和totalPhoto。 –

+0

謝謝你的提醒。我編輯了代碼來添加這兩個變量。 –

0

這是一個簡單的方法來做到這一點:

SELECT 
p.id, p.name, 
(SELECT COUNT(*) FROM Review r WHERE r.placeId=p.id) AS totalReview 
(SELECT COUNT(*) FROM Favorite f WHERE f.placeId=p.id) AS totalFavorite 
(SELECT COUNT(*) FROM Photo ph WHERE ph.placeId=p.id) AS totalPhoto 
FROM Place p 
+0

它可能會返回OP想要的記錄,但是你沒有使用'LEFT Join'。 –

+0

哇,我不知道這種問題可以通過使用你簡單的解決方案來解決:D,它的工作原理!與上面的@Gordon Linoff解決方案相比,此解決方案更高效嗎? –

+1

在大多數數據庫中,這兩種解決方案應該生成相同的查詢計劃。由於各種原因,我避開相關子查詢:對我來說,它們的可讀性較差;有時候,它們被實現爲嵌套循環連接;最後我喜歡查詢引用的所有表都在from子句中。 –