MySQL заказал - PullRequest
       48

MySQL заказал

0 голосов
/ 08 мая 2018

Используя 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 голосов
/ 14 мая 2018

Если я вас правильно понимаю, то я бы предложил, как на вашем примере:

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, но оно работает.

0 голосов
/ 08 мая 2018

Я не уверен, что понимаю, чего ты хочешь. Но из твоего примера я думаю

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

...