2017-06-29 76 views
0

我正在处理别人的项目。有这样的查询:我应该在使用IN子句时使用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的原因是省略了每个关键字匹配的重复帖子。

+0

集团的,对于像记录匹配。它与IN命令完全不同。 – Chuck

+1

'GROUP BY'在这两种错误地使用,并且可以删除重复记录为不正确使用的副作用。它用于MIN(),MAX(),COUNT(),SUM()等聚集。要对这些进行重复数据删除,请使用“SELECT DISTINCT”。 –

+2

Group by不是简单多余的;在这两种情况下完全不合适 – Strawberry

回答

1

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

只是因为MySQL允许这种奇怪的行为不会使IT最佳实践。其他的DBMS例如PostgreSQL将不允许这个查询执行。

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

您应该使用DISTINCT从我所看到的。


回答你的问题

=更换IN不影响在所有分组,所以你可以自由地去用它,特别是如果你不及格名单,但单个值到查询,但GROUP BY在任何情况下都不是多余的(或者应该在两者中完全删除)。它会改变你收到的输出。

如果,例如,通过一个独特的列的表内的分组并加入该到表1:1的关系GROUP BY是多余的。作为第二个例子,构造具有条件的合适的WHERE子句也可能使其成为冗余。

+0

我认为结果总是独一无二的。我不知道你为什么认为可能有重复的帖子匹配。 [这里](https://stackoverflow.com/questions/44444902/how-can-i-select-all-posts-which-have-specific-tags)是我的表结构。你还认为需要'GROUP BY'吗? –

+1

正如我所说:_“或应该完全删除”_。我不熟悉您在表上强制执行的主键和约束。如果'posts(id)'是唯一的,'tags(id)'是唯一的,'pivot(post_id,tag_id)'是唯一的,那么在** BOTH **查询中你不需要'GROUP BY'。 –

+0

知道了..只是为了您的信息,我猜在第一个查询中需要** GROUP BY **。由于它使用'IN'子句,并且可以为每个不同的标签多次匹配帖子。假设一篇文章有​​'mysql'和'sql'标签。所以这个帖子在这种情况下会匹配两次'IN'('mysql','SQL')',一次是'mysql'和一次'sql'。所以当条件为“IN”时需要'GROUP BY'。 –