#mysql #mariadb #sql
В БД (MySQL) есть таблица tab с внешним ключом parent_id и некоторым набором полей.
Поле order отвечает за очередность вывода данных и содержит значения 1,2,3 и т.п.
Для проверки валидности данных нужно сопоставить количество значений для с одинаковым
parent_id и максимальное значение в поле order.
Текущее решение:
SELECT l.parent_id,
l.m,
r.c
FROM ( SELECT parent_id
max(`order`) as m
FROM tab
GROUP BY parent_id ) AS l
INNER JOIN ( SELECT parent_id,
count(*) AS c
FROM tab
GROUP BY parent_id ) AS r
ON l.parent_id = r.parent_id
WHERE l.m <> r.c;
Запрос - рабочий, но очень медленный.
Вопрос к SQL-оптимизаторам: как упростить и каково направление размышлений в процессе
улучшения запроса?
Ответы
Ответ 1
Слишком сложно. Если правильно понял, то: select parent_id, count(*), max(`order`) from tab group by parent_id having count(*)<>max(`order`) SQLFiddle
Комментариев нет:
Отправить комментарий