使用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
,然后计算结果......但这很慢。我们的目标是尽可能快。
由于
答案 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
子句慢,但它有效。