Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Одновременный подсчет элементов и выборка максимального значения

#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

Комментариев нет:

Отправить комментарий