我在一张桌子上有一个博客文章表。在一个单独的表中,我有一些存储在目录中的图像记录,这些图像与特定的博客文章相关联。
如何撰写仅选择至少包含5张照片的博文的查询?
BlogPosts表有一个“ID”列。 Photos表中有一个'PostID'列,对应于BlogPosts的'ID'列。
$query = "SELECT * FROM BlogPosts WHERE ?"
答案 0 :(得分:6)
SELECT *
FROM BlogPosts
WHERE ID IN
(SELECT PostID FROM photos GROUP BY PostID HAVING count(*) >= 5)
答案 1 :(得分:1)
这是一个应该返回指定结果集的语句示例。
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
。内联视图从照片表中返回不同的PostID值列表,照片表中至少有五行。然后它将结果集“连接”到BlogPosts表,因此它只返回具有与子查询中的PostID匹配的ID的行。
注意:在MySQL上,使用内联视图的此表单(通常)比使用IN (subquery)
谓词更好。
注意:请平息任何在视图中“隐藏”此内容的冲动,只是为了以后需要稍后阅读此代码的其他人,并找出查询的内容做。
答案 2 :(得分:0)
获取照片中每个PostID至少有五个的行...
从PostID
中的照片组中选择PostID,count(PostID)作为出现只获得那些至少有五个......
的人选择PostID(从PostID中选择PostID,count(PostID)作为出现的照片组)p其中出现> = 5
获取对应的博客文章......
从BlogPosts中选择*,其中ID为(从PostID中选择PostID(选择PostID,计数(PostID)为照片组中的出现)p where occurrence出现> = 5);
或者,实际上 - 您应首先创建一个视图,该视图仅返回具有五次以上出现的照片中的PostID:
创建视图atLeastFive作为select PostID from(选择PostID,count(PostID)作为PostID照片组中的出现)p where occurrence出现> = 5
然后您的查询看起来更具代表性:
从BlogPosts中选择*,其中ID为(从theLeastFive中选择PostID)
确保你的照片表在PostID上有一个索引,否则性能最终会受到影响。