テーブルが3つあります。
投票の合計と投稿に関連付けられている画像の数とともに、投稿のすべてのデータを取得できるようにしたいと考えています。どちらか一方を取得できますが、両方を同時に取得することはできません。
このコードは、投稿のスコアを取得するために機能します
SELECT
posts.*,
COALESCE(SUM(votes.value), 0) as score
FROM posts
LEFT JOIN votes ON posts.post_id = votes.target_id
GROUP BY posts.post_id
このコードは、投稿と一緒に画像の数を取得するために機能します
SELECT
posts.*,
COALESCE(COUNT(images.image_id), 0) as num_images
FROM posts
LEFT JOIN images ON posts.post_id = images.belongs_to_post
GROUP BY posts.post_id
しかし、2つを組み合わせて
SELECT
posts.*,
COALESCE(COUNT(images.image_id), 0) as num_images,
COALESCE(SUM(votes.value), 0) as score
FROM posts
LEFT JOIN votes ON posts.post_id = votes.target_id
LEFT JOIN images ON posts.post_id = images.belongs_to_post
GROUP BY posts.post_id
これscore
は画像の数で乗算されます。これを効果的に停止するにはどうすればよいですか?別の列でグループ化する必要がありますか?
MySQL 5.7.31を使用しています。
相関サブクエリをお勧めします。
SELECT p.*,
(SELECT COUNT(*)
FROM images i
WHERE p.post_id = i.belongs_to_post
) as num_images,
(SELECT COALESCE(SUM(v.value), 0)
FROM votes v
WHERE p.post_id = v.target_id
) as score
FROM posts p;
インデックスがimages(belongs_to_post)
とのvotes(target_id, value)
場合、これはおそらく、外部クエリで集計を使用するアプローチよりもはるかに高速です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加