gpt4 book ai didi

mysql - 查询每组前 N 个代码适用于 MySQL,但 MariaDB 的结果不同

转载 作者:可可西里 更新时间:2023-11-01 06:42:30 24 4
gpt4 key购买 nike

我有一个 SQL 查询,它提取每组的最新 3 条记录。 MySQL 的查询结果与 MariaDB 不同。此查询在下面的 sqlfiddle 中实现

http://sqlfiddle.com/#!9/c09fe/2

表格内容

CREATE TABLE tmp
(`mac_addr` varchar(10), `reader_name` varchar(22), `value` numeric, `time_change` datetime)
;

INSERT INTO tmp
(`mac_addr`, `reader_name`, `value`, `time_change`)
VALUES
('''B99A88''', '''name_8''', 1, '2016-07-07 19:21:48'),
('''B99A88''', '''own__detect_1''', 1, '2016-06-21 13:30:00'),
('''B99A88''', '''own__temperature_1''', 37.4, '2016-05-04 18:23:03'),
('''B99A88''', '''own__temperature_1''', 29.4, '2016-05-04 18:19:33'),
('''B99A88''', '''own__temperature_1''', 28.4, '2016-05-04 18:17:32'),
('''B99A88''', '''own__temperature_1''', 27.4, '2016-05-04 18:04:08'),
('''B99A88''', '''own__temperature_1''', 21.4, '2016-05-04 15:11:42'),
('''B99A88''', '''own__detect_1''', 0, '2016-04-20 15:22:23'),
('''B99A88''', '''own__detect_1''', 1, '2016-04-15 17:39:52'),
('''B99A88''', '''own__detect_1''', 0, '2016-04-15 17:39:46'),
('''B99A88''', '''own__detect_1''', 1, '2016-04-11 17:34:00'),
('''B99A88''', '''own__detect_1''', 1, '2016-04-11 17:33:00'),
('''B99A88''', '''own__detect_1''', 0, '2016-04-11 17:33:00'),
('''B99A88''', '''own__temperature_1''', 28.4, '2016-04-10 21:20:20'),
('''B99A88''', '''own__temperature_1''', 32.5, '2016-04-10 21:00:00'),
('''B99A88''', '''own__temperature_1''', 34.2, '2016-04-10 11:29:00')
;

查询以提取每组的最新 3 条记录。

SELECT mac_addr, reader_name, value, time_change
FROM (
SELECT t1.*,
IF(@rn = reader_name, @rowno := @rowno + 1, @rowno := 1) AS rowno,
@rn := reader_name
FROM (
SELECT *
FROM tmp
ORDER BY reader_name, time_change DESC
) t1
CROSS JOIN (SELECT @rn := null, @rowno := 0) t2
) t
WHERE rowno <= 3

使用MySQL v5.6时的结果如下;

mac_addr    reader_name             value   time_change
'B99A88' 'name_8' 1 July, 07 2016 19:21:48
'B99A88' 'own__detect_1' 1 June, 21 2016 13:30:00
'B99A88' 'own__detect_1' 0 April, 20 2016 15:22:23
'B99A88' 'own__detect_1' 1 April, 15 2016 17:39:52
'B99A88' 'own__temperature_1' 37 May, 04 2016 18:23:03
'B99A88' 'own__temperature_1' 29 May, 04 2016 18:19:33
'B99A88' 'own__temperature_1' 28 May, 04 2016 18:17:32

MySQL 结果就是我想要的。但是,我使用的是 MariaDB,结果与 MySQL 结果不同。

MariaDB 结果如下所示;

mac_addr    reader_name             value   time_change
'B99A88' 'name_8' 1 2016-07-07 19:21:48
'B99A88' 'own__detect_1' 1 2016-06-21 13:30:00
'B99A88' 'own__temperature_1' 37 2016-05-04 18:23:03
'B99A88' 'own__temperature_1' 29 2016-05-04 18:19:33
'B99A88' 'own__temperature_1' 28 2016-05-04 18:17:32
'B99A88' 'own__detect_1' 0 2016-04-20 15:22:23
'B99A88' 'own__detect_1' 1 2016-04-15 17:39:52
'B99A88' 'own__detect_1' 0 2016-04-15 17:39:46
'B99A88' 'own__temperature_1' 28 2016-04-10 21:20:20
'B99A88' 'own__temperature_1' 33 2016-04-10 21:00:00
'B99A88' 'own__temperature_1' 34 2016-04-10 11:29:00

如何修改查询代码,使MariaDB的查询输出与MySQL一致?在 MariaDB 中使用窗口函数是个好主意吗?

最佳答案

允许查询执行忽略 FROM ( SELECT ... ) 中的ORDER BY。这可能是您所看到的差异的真正原因。 (我认为戈登的回答不相关。)

问题在这里讨论(4 年前):https://mariadb.com/kb/en/mariadb/group-by-trick-has-been-optimized-away/ ;通过设置有一个解决方案。

其他一些解决方案在这里:http://mysql.rjweb.org/doc.php/groupwise_max ;它们旨在提高效率。

还有一个可能的解决方案是在子查询上添加一个带有大数字的伪造LIMIT

关于mysql - 查询每组前 N 个代码适用于 MySQL,但 MariaDB 的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421218/

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