MySQL заказал
Используя MySQL "искать до" и имея в виду пример на /questions/31078413/mysql-vyiberite-do-v-sql/31078438#31078438, я получаю правильно упорядоченные результаты:
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 ответа
Если я вас правильно понимаю, я бы предложил, как на вашем примере:
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
Сначала он получает все результаты, затем сортирует их, а затем получает (считает) все, пока не будет достигнут целевой идентификатор. Это действительно медленнее, чем без HAVING
оговорка, но это работает.
SELECT COUNT(*) FROM (SELECT NULL FROM table ... ORDER BY date DESC) _xx
Я не уверен, что понимаю, чего ты хочешь. Но из твоего примера я думаю
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
тем не менее, так как строки названия месяцев не будут отсортированы после номера соответствующих месяцев. Или используйте таблицу сопоставления, отображающую значения в целые числа, определяющие порядок.)