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

标签 mysql sql postgresql group-by

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

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/

相关文章:

asp.net - 为什么我会间歇性地收到此错误? "The server was not found or was not accessible"

mysql - 从逗号分隔的文本创建表格

android - getReadableDatabase 崩溃,onCreate 未被调用

postgresql - Sequelize hasMany 添加 id 数组

php - "Error establishing a database connection"Wordpress 和谷歌应用引擎

mysql - 更改mysql输出列宽

MySQL过滤查询

php - 分两行后选择前5名MySQL

postgresql - Flutter + Dart App与Postgres数据库的连接与查询

sql - 更新表时在 "FROM"或附近出现语法错误