mysql根据另一个表的计数选择行

时间:2012-08-08 13:56:14

标签: mysql sql count

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

如何撰写仅选择至少包含5张照片的博文的查询?

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

$query = "SELECT * FROM BlogPosts WHERE ?"

3 个答案:

答案 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上有一个索引,否则性能最终会受到影响。