在GROUPing时,mariaDB不支持SELECT语句中的函数依赖吗?

时间:2016-10-17 10:33:08

标签: mysql mariadb

我的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没有实现此功能吗?

由于

4 个答案:

答案 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公共许可证提供。