gpt4 book ai didi

如果询问不同的值,Mysql group_concat order by DESC 意外行为

转载 作者:行者123 更新时间:2023-11-29 02:12:08 27 4
gpt4 key购买 nike

CREATE OR REPLACE TABLE `tmp` (
`ord` int(5) unsigned NOT NULL DEFAULT 10000,
`val` varchar(50) CHARACTER SET utf8 COLLATE utf8_estonian_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tmp` (`ord`, `val`)
VALUES (1,'foo'), (2,'baz'), (3,'baz'), (4,'foo');

现在考虑查询

-- 1) Example with ASC sorting
select group_concat( distinct val
ORDER BY ord ASC SEPARATOR ';') from tmp;

正如预期的那样,它会输出 foo;baz
问题是,为什么

-- 2) Example with DESC sorting
select group_concat( distinct val
ORDER BY ord DESC SEPARATOR ';') from tmp;

输出 baz;foo?

看起来如果 Mysql 执行升序排序,然后将它反转为 DESC。
我希望从 (4,'foo'), (3,'baz') 返回结果。

数据库版本 = 10.2.12-MariaDB-log

编辑:

如果涉及的数据多一点,它会更加引人注目:DBFiddle

INSERT INTO `tmp` (`ord`, `val`)
VALUES (1,'foo'), (2,'baz'), (3,'baz'), (4,'bar'), (5,'foo');

select group_concat( distinct val
ORDER BY ord ASC SEPARATOR ';') from tmp ;

--> foo;baz;bar

select group_concat( distinct val 
ORDER BY ord DESC SEPARATOR ';') from tmp;

--> bar;baz;foo ??
我确实期望 foo;bar;baz 在这里。

如果不需要 DISTINCT,无论是 ASC 还是 DESC,数据库都会按预期返回。

最佳答案

在进一步调查之后,事实证明这很简单,所有返回的结果——预期的或意外的——确实是正确的。

MySQL 5.7 Reference Manual中的神奇句子是

Result set sorting occurs after values have been chosen

所以

select group_concat( distinct val 
ORDER BY ord XXSC SEPARATOR ';') from tmp;

首先执行作业的 DISTINCT 部分并将其作为中间结果:

-- unordered
(1,'foo'), (2,'baz')

现在引擎接受这个结果并对其进行排序。根据要求 ASC 或 DESC。

关于如果询问不同的值,Mysql group_concat order by DESC 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087379/

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