3

我在一个表中有一张博客文章表。在一个单独的表中,我有存储在与特定博客文章相关的目录中的图像记录。

如何编写仅选择至少有 5 张照片的博客文章的查询?

BlogPosts 表有一个“ID”列。Photos 表有一个 'PostID' 列,对应于 BlogPosts 的 'ID' 列。

$query = "SELECT * FROM BlogPosts WHERE ?"
4

3 回答 3

7
SELECT * 
FROM BlogPosts 
WHERE ID IN 
    (SELECT PostID FROM photos GROUP BY PostID HAVING count(*) >= 5)
于 2012-08-08T14:02:30.583 回答
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 表,因此它只返回 ID 与子查询中的 PostID 匹配的行。

注意:在 MySQL 上,这种使用内联视图的表单(通常)会比使用IN (subquery)谓词执行得更好。

注意:请平息任何你必须在视图中“隐藏”它的冲动,只是为了以后需要阅读这段代码的其他人,并弄清楚查询在做什么。

于 2012-08-08T14:09:11.057 回答
0

要获取照片中每个 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 上有一个索引,否则性能最终会受到影响。

于 2012-08-08T14:05:34.443 回答