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 тем не менее, так как строки названия месяцев не будут отсортированы после номера соответствующих месяцев. Или используйте таблицу сопоставления, отображающую значения в целые числа, определяющие порядок.)

Другие вопросы по тегам