2016-07-06 69 views
0

我試圖從表中獲取一組集合,我無法弄清楚如何使用LEFT JOIN從相關表'like_collections'中計算喜歡的數目句法。MySQL計算來自INNER關係的項目數

正如你可以在查詢中看到,每個collection_id我需要得到用戶的,像這樣的收集數量。

我知道我只能使用(SELECT COUNT(*) FROM likes_collections WHERE collection_id=cn.id) as n_likes,但想知道是否可以使用下面的查詢。

SELECT cn.id, 
     cn.name, 
     cn.description, 
     u.avatar, 
     u.username, 
     COUNT(lc.id) as n_likes, 
    (SELECT COUNT(*) FROM collection_items WHERE collection_id=cn.id) as n_items 
FROM collection_names as cn 
INNER JOIN users as u ON u.ID=cn.user_id 
LEFT JOIN likes_collections as lc ON lc.collection_id=cn.id 
WHERE cn.public=1 
GROUP BY lc.collection_id 
ORDER BY cn.published_date DESC 
LIMIT 0, 5 
+0

「n_likes」後面缺少逗號。 – Barmar

+0

謝謝,我更新了查詢。 – domoindal

回答

0

當你有一個LEFT JOIN,你不應該在子表中GROUP BY使用列。這是因爲當主表中沒有匹配的行時,該表中的列將全部爲NULL,並且會將所有不匹配的行組合在一起。所以你應該GROUP BY cn.id而不是GROUP BY lc.collection_id

而不是相關的子查詢,您可以加入一個子查詢來計算按集合ID分組的項目數。

SELECT cn.id, 
     cn.name, 
     cn.description, 
     u.avatar, 
     u.username, 
     COUNT(lc.id) as n_likes, 
     n_items 
FROM collection_names as cn 
INNER JOIN users as u ON u.ID=cn.user_id 
LEFT JOIN likes_collections as lc ON lc.collection_id=cn.id 
LEFT JOIN (SELECT collection_id, COUNT(*) AS n_items 
      FROM collection_items 
      GROUP BY collection_id) AS ci ON ci.collection_id = cn.id 
WHERE cn.public=1 
GROUP BY cn.id 
ORDER BY cn.published_date DESC 
LIMIT 0, 5