sqlfiddle:http://sqlfiddle.com/#!2/9a8b3/1
从小提琴中获取结构和数据以及查询, 导入我的MariaDB 5.5.31,我得到不同的结果:
sqlfiddle
PID NAME LEAGUEPOINTS TOTALLEAGUEPOINTS
2 Peter 16,13,9,4,2 44
1 Daniel 3425,543,234,43,29,22,21,21,19,17,13,12,12,12,11,9,9,9,8,7 4476
MariaDB的
pid name leaguepoints totalleaguepoints
2 Peter 16,13,9,4,2 44
1 Daniel 3425,543,234,43,29,22,21,21,19,17,13,12,12,12,11,9,9,9,8,7,7,6,5,5,4,4,4,3,3,2,1 4520
查询:
SELECT
p.pid,
p.name,
GROUP_CONCAT( gC.leaguepoints ORDER BY leaguepoints DESC ) AS leaguepoints,
SUM(gC.leaguepoints) AS totalleaguepoints
FROM test_golf_player p
LEFT JOIN
(
SELECT pid, leaguepoints, @Sequence:=IF(@PrevPid = pid, @Sequence + 1, 0) AS aSequence, @PrevPid := pid
FROM
(
SELECT pid, leaguepoints
FROM test_golf_card
ORDER BY pid, leaguepoints DESC
) Sub1
CROSS JOIN (SELECT @PrevPid := 0, @Sequence := 0) Sub2
) gC
ON p.pid = gC.pid AND aSequence < 20
GROUP BY p.pid
ORDER BY p.name DESC
知道为什么吗?
答案 0 :(得分:1)
害怕我没有手中的MariaDB,但是你可以尝试以下方法来看看如何输出用户变量: -
SELECT *
FROM test_golf_player p
LEFT JOIN
(
SELECT pid, leaguepoints, @Sequence:=IF(@PrevPid = pid, @Sequence + 1, 0) AS aSequence, @PrevPid := pid
FROM
(
SELECT pid, leaguepoints
FROM test_golf_card
ORDER BY pid, leaguepoints DESC
) Sub1
CROSS JOIN (SELECT @PrevPid := 0, @Sequence := 0) Sub2
) gC
ON p.pid = gC.pid
ORDER BY p.name DESC
编辑 - 在查看结果时进行一些调查似乎MariaDB忽略了子查询中的ORDER BY。因此,序列号是随机顺序,并且当pid改变时也会重置(由于顺序不固定,它会随机重复)。有点谷歌,似乎这是MariaDB的故意特征。 SQL标准将表定义为无序行集,子选择被视为表,因此忽略了order by - https://kb.askmonty.org/en/why-is-order-by-in-a-from-subquery-ignored/。
这有点不利。不确定是否有解决办法,因为我现在想不到一个。对于这个要处理的原始问题,我认为有必要使用可能效率不高的相关子选择。