1つのテーブルにブログ投稿のテーブルがあります。別のテーブルに、特定のブログ投稿に関連付けられているディレクトリに保存されている画像のレコードがあります。
少なくとも5枚の写真があるブログ投稿のみを選択するクエリを作成するにはどうすればよいですか?
BlogPostsテーブルには「ID」列があります。写真テーブルには、BlogPostsの「ID」列に対応する「PostID」列があります。
$query = "SELECT * FROM BlogPosts WHERE ?"
SELECT *
FROM BlogPosts
WHERE ID IN
(SELECT PostID FROM photos GROUP BY PostID HAVING count(*) >= 5)
指定した結果セットを返すステートメントの例を次に示します。
SELECT b.*
FROM BlogPosts b
JOIN (SELECT p.PostID
FROM photos p
GROUP BY p.PostID
HAVING COUNT(1) >= 5
) c
ON c.PostID = b.ID
このクエリは、エイリアスとしてインライン ビューを使用しますc
。インライン ビューは、photos テーブルに少なくとも 5 つの行がある photos テーブルから PostID 値の個別のリストを返しています。次に、その結果セットを BlogPosts テーブルに「結合」して、サブクエリの PostID と一致する ID を持つ行のみを返します。
注:IN (subquery)
MySQL では、インライン ビューを使用するこの形式は、(通常)述語を使用するよりも優れたパフォーマンスを発揮します。
注:後でこのコードを読む必要がある他の誰かのために、ビューでこれを「非表示」にしなければならない衝動を抑えて、クエリが何をしているかを理解してください。
PostID ごとに少なくとも 5 つある Photos の行を取得するには...
PostID による写真グループからのオカレンスとして PostID を選択し、count(PostID)
少なくとも 5 つあるものだけを取得するには...
select PostID from (select PostID, count(PostID) from Photos group by PostID) p where occurances >= 5
対応するブログ投稿を取得するには...
select * from BlogPosts where ID in (select PostID from (select PostID, count(PostID) from Photos group by PostID) p where occurances >= 5);
または、実際には、5 回以上出現する Photos から PostID のみを返すビューを最初に作成する必要があります。
create view atLeastFive as select PostID from (select PostID, count(PostID) from Photos group by PostID) p where occurances >= 5
次に、クエリはもう少し見栄えがよくなります。
select * from BlogPosts where ID in (select PostID from atLeastFive)
Photos テーブルに PostID のインデックスがあることを確認してください。そうしないと、パフォーマンスが低下します。