MySQL计数订购

时间:2018-05-08 09:51:23

标签: mysql sql count sql-order-by select-until

使用MySQL“搜索到”,并考虑到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

它始终返回已创建的计数,而不考虑ORDER BY

示例:在列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,然后计算结果......但这很慢。我们的目标是尽可能快。

由于

2 个答案:

答案 0 :(得分:1)

我不确定我理解你想要什么。但是从我的例子来看,我认为

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使用正确的类型,因为月份名称的字符串不会在相应月份的数量之后排序。或者使用映射表将值映射到定义的整数订单。)

答案 1 :(得分:0)

如果我理解正确,那么我建议你做一个例子:

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子句慢,但它有效。