我试图了解MySql 5.7的工作原理。在下面的查询中
SELECT
r.*,
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
GROUP BY r.user_id
ORDER BY r.date ;
我收到错误“SELECT列表不在GROUP BY子句中,并且包含非聚合列'r.id',它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by [code:42000]不兼容]“
但像这样的查询工作正常:
SELECT
r.id,
r.event_id,
r.user_id,
r.date
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
GROUP BY r.user_id, r.event_id, r.id, r.date
ORDER BY r.date ;
由于我正在使用localhost,我可以更改my.ini文件并将sql_mode设置为“STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER”
但是当它上线时,这将是一个问题,因为很多人不会访问my.ini文件,特别是在共享主机上。
在我看来,声明每个字段并相应地聚合是非常有效的。
由于我在MySql中的知识只是初学者,有没有更好的方法来编写上面的查询。在我需要从单个表中提取10或20个字段的情况下,聚合所有字段似乎有点傻。
答案 0 :(得分:1)
概念很简单,您必须在所有未参与聚合函数的列中声明
你的
SELECT
r.id,
r.event_id,
r.user_id,
r.date
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
GROUP BY r.user_id, r.event_id, r.id, r.date
ORDER BY r.date ;
相当于
SELECT DISTINCT
r.id,
r.event_id,
r.user_id,
r.date
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
ORDER BY r.date ;
在第一个你有r。*但这不是分组