我遇到了一些生成如下所示的查询的PHP代码(为了清楚起见,我省略了WHERE子句)
SELECT user.id FROM users
JOIN table2 ON table2.user_id = users.id
GROUP BY users.id, users.id
现在,它似乎有效,但我厌倦了GROUP BY中的重复项。我知道GROUP BY users.id, users.id
没有意义,我可以在没有分组的情况下使用SELECT distinct(user.id)
。
我想知道它是否会导致问题,或者它是否总是只是执行
SELECT user.id FROM users
JOIN table2 ON table2.user_id = users.id
GROUP BY users.id
答案 0 :(得分:1)
这是您的查询(添加了初始“S”):
SELECT user.id
FROM users JOIN
table2
ON table2.user_id = user.id
GROUP BY user.id, user.id;
此查询在语法上不正确。您有一个名为users
的表,它从未被引用,而一个别名user
从未定义过。如果生成此代码,则错误比group by
子句中的重复错误更大。
如果表格设置正确,则table2.user_id
应始终为users
表中的有效ID。如果是这样,那么以下是一个更简单的查询版本:
SELECT distinct t.user_id as id
FROM table2 t;
这与:和
之间的区别SELECT t.user_id as id
FROM table2 t
GROUP BY t.user_id;
非常小(他们应该生成相同的执行计划)。但是,因为MySQL支持“隐藏列” - 即select
子句中未聚合而不在group by
子句中的列 - 在某些情况下distinct
和group by
不一样。这不适用于其他数据库。并且,我认为这些情况是形成不良的SQL,但它们确实存在。这是一个例子:
SELECT distinct t.user_id as id, t.value
FROM table2 t;
不一定与:
相同SELECT t.user_id as id, t.value
FROM table2 t
GROUP BY t.user_id;
虽然两者在语法上都是正确的MySQL语句。