2016-07-06 7 views
0

テーブルからコレクションを取得しようとしていますが、LEFT JOINを使用して関連テーブル 'like_collections'から好きな数を計算する方法がわかりません構文。MySQLはINNER関係からアイテム数を計算します

クエリでわかるとおり、それぞれcollection_id私はそのようなコレクションが好きなユーザーの数を取得する必要があります。

私は単に(SELECT COUNT(*) FROM likes_collections WHERE collection_id=cn.id) as n_likesを使用できますが、以下のクエリを使用することが可能かどうかを知りたいと思っています。あなたはLEFT JOINを持っている場合

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

は、あなたがGROUP BYで子テーブルの列を使用しないでください。これは、マスター表の行に一致するものがない場合、その表の列はすべてNULLになり、一致しないすべての行をまとめてグループ化するためです。したがってGROUP BY lc.collection_idではなく、GROUP BY cn.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 
関連する問題