2009-11-14 100 views
0
$query = "SELECT posts.* 
    FROM map, posts, tags 
    WHERE map.tag_id = tags.id 
    AND (tags.name IN ('mysql', 'database')) 
    AND map.post_id = posts.id 
    GROUP BY posts.id 
    HAVING COUNT(posts.id) = 2"; 

我不明白最后一行。有人可以为我解释吗?如果我没有在那里有什么区别?帮我理解这个MySQL代码

+0

选择*当你使用GROUP BY也是坏的风格,因为它不会在大多数DBMS编译,不会对MySQL的 – Dmitry 2009-11-14 00:59:40

+1

任何预测的行为BTW,现在当你问了几个问题并得到答案,您可能需要将其中的一些标记为“回答”您的问题(如果其中有任何问题) – Dmitry 2009-11-14 01:02:03

+0

另外:'SELECT posts。*'是可以接受的,因为'GROUP'在'posts.id '。假设这是主键,那么''.post。*''在功能上依赖于'组列中的所有其他列。当您尝试选择在GROUPing列中没有功能依赖关系的未聚合列时,只会在ANSI SQL中出现错误。你可能仍然认为任何旧的SELECT *都可能是不好的风格,但这是另一回事...... – bobince 2009-11-14 03:24:22

回答

5

最后一行表示您只留下那些具有完全2个后ID的组。如果你删除它,所有组将被选中。

+0

请不要改变你的问题,这样它就会变得完全不同 – Dmitry 2009-11-14 00:55:20

0

“HAVING”谓词充当过滤器,它只选择具有两(2)个相同post.id的行。

它看起来像查询查找具有重复ID的行。

HAVING COUNT(posts.id) > 1 

可能会更好,为此目的。

0

从文档:

HAVING子句应用于几乎最后,只是在项目被发送到客户端,没有优化。 (LIMIT是在HAVING之后应用的)。

所以where子句被应用,然后分组,然后拥有..可以应用到您的分组之后通过累计的值汇总了所有聚合,例如SUM或MAX。

http://dev.mysql.com/doc/refman/5.1/en/select.html