我使用IN子句时应该使用GROUP BY吗?

时间:2017-06-29 17:06:13

标签: mysql group-by

我正在为别人的项目工作。有这样的查询:

SELECT     posts.id, posts.title, posts.body, posts.keywords 
FROM       posts
INNER JOIN pivot ON pivot.post_id = posts.id
INNER JOIN tags ON tags.id = pivot.tag_id
WHERE      tags.name IN ( :keywords )
GROUP BY   posts.id

新政策是将IN替换为=。所以我写的查询看起来像这样:

SELECT     posts.id, posts.title, posts.body, posts.keywords 
FROM       posts
INNER JOIN pivot ON pivot.post_id = posts.id
INNER JOIN tags ON tags.id = pivot.tag_id
WHERE      tags.name = :keyword
GROUP BY   posts.id

现在我想知道,在这种情况下,GROUP BY是多余的吗?我这样说是因为我认为GROUP BY的原因是省略了每个关键字匹配的重复帖子。

1 个答案:

答案 0 :(得分:1)

首先,在GROUP BY语句中使用SELECT时,每个未包含在分组子句中的列都应该用聚合函数进行包装。

仅仅因为MySQL允许这种奇怪的行为并不能使其成为最佳实践。其他DBMS例如PostgreSQL根本不允许执行此查询。

说,它在MySQL内部的工作原理只是你为每个posts.id获得一个唯一的记录,但是对于所有非聚合和非分组列,可能来自不同行的随机值。

你应该从我能看到的地方使用DISTINCT

回答您的问题

IN替换为=根本不会影响分组,因此您可以随意使用它,特别是如果您没有传递列表但只有一个值到该查询,但是{ {1}}在任何情况下都不是多余的(或者应该在两者中完全删除)。它会改变你收到的输出。

例如,如果您按表中的唯一列分组并将其连接到具有1:1关系的表GROUP BY将是多余的。作为第二个示例,使用条件构造正确的GROUP BY子句也可能使其冗余。