我在一个表中有一张博客文章表。在一个单独的表中,我有存储在与特定博客文章相关的目录中的图像记录。
如何编写仅选择至少有 5 张照片的博客文章的查询?
BlogPosts 表有一个“ID”列。Photos 表有一个 'PostID' 列,对应于 BlogPosts 的 'ID' 列。
$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
. 内联视图从照片表中返回一个不同的 PostID 值列表,照片表中至少有五行。然后它将该结果集“连接”到 BlogPosts 表,因此它只返回 ID 与子查询中的 PostID 匹配的行。
注意:在 MySQL 上,这种使用内联视图的表单(通常)会比使用IN (subquery)
谓词执行得更好。
注意:请平息任何你必须在视图中“隐藏”它的冲动,只是为了以后需要阅读这段代码的其他人,并弄清楚查询在做什么。
要获取照片中每个 PostID 至少有五个的行...
按 PostID 从照片组中选择 PostID、count(PostID) 作为出现次数
只得到至少有五个的那些......
select PostID from (select PostID, count(PostID) as occurances from Photos group by PostID) p where occurances >= 5
要获取对应的博客文章...
select * from BlogPosts where ID in (select PostID from (select PostID, count(PostID) as occurances from Photos group by PostID) p where occurances >= 5);
或者,真的 - 您应该首先创建一个视图,该视图仅返回出现次数超过五次的照片中的 PostID:
创建视图 atLeastFive 作为 select PostID from (select PostID, count(PostID) asoccurances from Photos group by PostID) p whereoccurrances >= 5
然后你的查询看起来更漂亮一点:
从 ID 所在的 BlogPosts 中选择 *(从 atLeastFive 中选择 PostID)
确保您的 Photos 表在 PostID 上有一个索引,否则性能最终会受到影响。