已排序的mysql计数

rkkpypqq  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(320)

使用mysql“search until”,并记住https://stackoverflow.com/a/45029807/5807146,我得到了正确排序的结果:

SELECT * FROM table, (SELECT @until_var := NULL) _until
WHERE ISNULL(@until_var := IF(value = 100, value, @until_var))
ORDER BY value DESC

下一步我需要的(而且没有成功)是计算订购数量:

SELECT COUNT(*) FROM table, (SELECT @until_var := NULL) _until
WHERE ISNULL(@until_var := IF(value = 100, value, @until_var))
ORDER BY value DESC

它总是返回founds的计数,而不考虑 ORDER BY .
示例:在db where列中 id 是主索引,列 date 可能是任何东西,我正试图让mysql从日期最高的条目中计数:

id | value | date
----|-------|----------
 1  | A     | mar
 2  | A     | jan
 3  | A     | apr
 4  | B     | feb

SELECT COUNT(*) FROM table, (SELECT @until_var := NULL) _until
WHERE value = "A" AND ISNULL(@until_var := IF(id = 4, value, @until_var))
ORDER BY date DESC

达到预期效果:

id | value | date
----|-------|----------
 3  | A     | apr
 1  | A     | mar

= 2

我目前(慢)的解决办法是得到列 id ,然后计算结果。。。但这很慢。目标是尽可能快。
谢谢

ulydmbyx

ulydmbyx1#

我不确定我是否明白,你想要什么。但从你的例子来看

SELECT e.id,
       e.value,
       e.date
       FROM elbat e
            INNER JOIN (SELECT value,
                               max(date) date
                               FROM elbat
                               GROUP BY value) gd
                       ON gd.value = e.value
                          AND gd.date = e.date;

可能就是你要找的(你得用合适的字体 date 但是,由于月份名称的字符串不会在相应月份的数字之后排序。或者使用Map表将值Map到定义顺序的整数。)

tvokkenx

tvokkenx2#

如果我对你的理解是正确的,那么我建议你举个例子:

SELECT COUNT(*) FROM table, (SELECT @until_var := NULL) _until
WHERE value = "A"
HAVING ISNULL(@until_var := IF(id = 4, value, @until_var))
ORDER BY date DESC

它首先获取所有结果,然后对它们进行排序,然后获取(计数)所有结果,直到到达目标id为止。它确实比没有 HAVING 条款,但它是有效的。

相关问题