gpt4 book ai didi

mysql - GROUP BY 仅主键,但选择其他值

转载 作者:可可西里 更新时间:2023-11-01 06:33:44 25 4
gpt4 key购买 nike

有没有一种方法可以按唯一(主)键进行分组,从本质上隐含地保证该表中的其他列将得到明确定义?

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com