我正在为别人的项目工作。有这样的查询:
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
的原因是省略了每个关键字匹配的重复帖子。
答案 0 :(得分:1)
首先,在GROUP BY
语句中使用SELECT
时,每个未包含在分组子句中的列都应该用聚合函数进行包装。
仅仅因为MySQL允许这种奇怪的行为并不能使其成为最佳实践。其他DBMS例如PostgreSQL根本不允许执行此查询。
说,它在MySQL内部的工作原理只是你为每个posts.id
获得一个唯一的记录,但是对于所有非聚合和非分组列,可能来自不同行的随机值。
你应该从我能看到的地方使用DISTINCT
。
回答您的问题
将IN
替换为=
根本不会影响分组,因此您可以随意使用它,特别是如果您没有传递列表但只有一个值到该查询,但是{ {1}}在任何情况下都不是多余的(或者应该在两者中完全删除)。它会改变你收到的输出。
例如,如果您按表中的唯一列分组并将其连接到具有1:1关系的表GROUP BY
将是多余的。作为第二个示例,使用条件构造正确的GROUP BY
子句也可能使其冗余。