【发布时间】:2017-04-01 11:13:13
【问题描述】:
我试图了解 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 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 'r.id';这与 sql_mode=only_full_group_by [代码: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 个字段的情况下,聚合所有字段似乎有点愚蠢。
【问题讨论】:
标签: mysql