我的SQL语句中有一些GROUP BY问题。
我正在使用mariaDB 10.1.17,并注意到我在执行以下SQL语句时遇到错误:
SELECT `pubs`.`ID` AS `ID`
,AVG(`reviews`.`atmosphere`) AS `average`
,`pubs`.`name` AS `name`
,`pubs`.`country` AS `country`
FROM `pubs`
LEFT JOIN `reviews` ON `pubs`.`ID` = `reviews`.`pub_ID`
GROUP BY `pubs`.`ID`
ORDER BY `average` DESC
,`reviews`.`date` DESC
我得到的错误是
“语法错误或访问冲突:1055'pubreviews.pubs.name'不是 在GROUP BY“
我的理解是,由于“功能依赖性” - 一个ID映射到一个名称和国家/地区的事实,因此不需要将这些列显式添加到group by语句中。
(我已打开ONLY_FULL_GROUP_BY
'')
这似乎暗示了here MySQL 5.7.5
鉴于此错误消息.. mariaDB没有实现此功能吗?
由于
答案 0 :(得分:3)
基于mariadb文档,如果启用ONLY_FULL_GROUP_BY
sql模式,它似乎不会考虑功能依赖性。
ONLY_FULL_GROUP_BY sql模式的文档说:
对于SELECT ... GROUP BY查询,禁止选择GROUP BY子句中未引用的列,除非它们传递给COUNT()或MAX()等聚合函数。产生1055错误。
因此,没有任何功能依赖的暗示。
我还检查了文档中有关group by子句的内容:
如果选择未分组的列或从非分组列计算的值,则未定义返回值的哪一行。如果使用ONLY_FULL_GROUP_BY SQL_MODE,则不允许这样做。
同样,没有任何功能依赖性的暗示。
上述内容自mariadb版本10.1.18和10.2.2起有效。
答案 1 :(得分:0)
如果您不关心您获得的名称,请更改
`pubs`.`name`
到
ANY_VALUE(`pubs`.`name`)
5.7.5的改进复杂性可能尚未合并到MariaDB中。
答案 2 :(得分:0)
我认为这会给你想要的结果,没有任何分组投诉。
SELECT pubs.`ID`,
r.`average`,
pubs.`name`,
pubs.`country`
FROM `pubs`
LEFT JOIN (
SELECT pub_id,
AVG(atmosphere) AS 'average'
MAX(date) AS 'last_review' -- which `date` do you want?
FROM reviews
GROUP BY pub_id
) AS r ON r.pub_id = pubs.ID
ORDER BY `average` DESC, last_review DESC
您可能会考虑是否真的需要LEFT
。使用常规JOIN
,查询可能会运行得更快。
答案 3 :(得分:0)
MariaDB是从MySQL 5.5分支出来的,然后他们开发了一些原始功能,并添加了一些从后续MySQL 5.6和5.7版本中反向移植的选定功能。
在5.5之后开发的MySQL的功能对于backport来说是不切实际的,因为实现依赖于重构代码。随着时间的推移,功能集的差异将变得更大。
如果您需要MySQL 5.7的功能,您应该使用MySQL 5.7。或者你可以自己将MySQL 5.7功能向后传输到MariaDB,并提供你的代码。
重新评论: 为什么MySQL的开源版本不会实现功能依赖..?
将MariaDB称为“MySQL的开源版本”意味着MySQL不是开源的。这是一个误解。 MySQL社区版继续是开源的,根据GNU公共许可证提供。