有没有一种方法可以按唯一(主)键进行分组,从本质上隐含地保证该表中的其他列将得到明确定义?
SELECT myPrimaryKey, otherThing
FROM myTable
GROUP BY myPrimaryKey
我知道我可以将其他列添加到语句 (GROUP BY myPrimaryKey,otherThing
),但我正在努力避免这种情况。如果您好奇原因,请继续阅读:
我有一个基本上是这样做的声明:
SELECT nodes.node_id, nodes.node_label, COUNT(1)
FROM {a couple of joined tables}
INNER JOIN nodes USING (node_id)
GROUP BY nodes.node_id, nodes.node_label
工作正常,但在 MySQL 中有点慢。如果我从 GROUP BY
中删除 nodes.node_label
,它的运行速度大约快 10 倍(根据 EXPLAIN
,这是因为较早的连接之一在以前不使用索引时开始使用索引)。
我们正处于迁移到 Postgres 的过程中,因此所有新语句都应该尽可能与 MySQL 和 Postgres 兼容。现在在 Postgres 中,原始语句运行得很快,但是新语句(减少了 group by)不会运行(因为 Postgres 更严格)。在这种情况下,这是一个假错误,因为该语句实际上是明确定义的。
有没有一种我可以使用的语法可以让相同的语句在两个平台上运行,同时让 MySQL 只使用分组依据中的一列来提高速度?
最佳答案
在较新版本的 MySql 中,您可能启用了 sql_mode=only_full_group_by
,这不允许在使用 group by
时选择非聚合列,即它会强制您使用类似 max()
或 avg()
或 group_concat()
的函数,有时您只需要任何值。
这个标志在 MySql 5.7 中默认启用。
启用该标志后,函数 any_value()
可用。
You can achieve the same effect without disabling ONLY_FULL_GROUP_BY by using ANY_VALUE() to refer to the nonaggregated column.
select t.index, any_value(t.insert_date)
from my_table t
group by t.index;
更多信息在这里: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by 和这里: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
关于mysql - GROUP BY 仅主键,但选择其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062994/