За последние 24 часа нас посетили 21533 программиста и 1681 робот. Сейчас ищут 1882 программиста ...

column must appear in the GROUP BY clause...

Тема в разделе "MySQL", создана пользователем shtrih, 2 мар 2024.

  1. shtrih

    shtrih Активный пользователь

    С нами с:
    10 дек 2015
    Сообщения:
    60
    Симпатии:
    3
    Всем привет.

    Хотел разобраться с ошибкой "column must appear in the GROUP BY clause or be used in an aggregate function" при написание скриптов. Ошибка мне понятно.

    Есть таблица

    Код (Text):
    1.  
    2.  
    3. CREATE TABLE`test-grp1`(
    4.     `id` int(100) NOT NULL DEFAULT '0',
    5.     `master_id` int(11) NOT NULL,
    6.     `zakaz_id` int(11) NOT NULL,
    7.     `status_id` int(11) NOT NULL,
    8.     `date` datetime NOT NULL
    9. );
    10.  
    11. --
    12. -- Dumping data for table `test-grp1`
    13. --
    14.  
    15. INSERT INTO `test-grp1` (`id`, `master_id`, `zakaz_id`, `status_id`, `date`) VALUES
    16. (590766, 1, 133480, 1, '2024-03-02 14:33:19'),
    17. (590767, 1, 133480, 2, '2024-03-02 14:33:19'),
    18. (590768, 1, 133480, 18, '2024-03-02 14:33:32'),
    19. (590772, 1, 133480, 6, '2024-03-02 14:35:07'),
    20. (590787, 1, 133480, 7, '2024-03-02 14:43:42'),
    21. (590788, 1233, 133480, 1, '2024-03-02 14:44:02'),
    22. (590789, 1233, 133480, 2, '2024-03-02 14:44:02'),
    23. (590791, 1233, 133480, 17, '2024-03-02 14:44:25'),
    24. (590795, 1159, 133480, 1, '2024-03-02 14:48:02'),
    25. (590796, 1159, 133480, 2, '2024-03-02 14:48:02'),
    26. (590801, 1159, 133480, 11, '2024-03-02 14:55:46'),
    27. (590807, 1122, 133480, 1, '2024-03-02 15:00:48'),
    28. (590808, 1122, 133480, 2, '2024-03-02 15:00:48'),
    29. (590811, 1122, 133480, 17, '2024-03-02 15:05:12'),
    30. (590812, 990, 133480, 1, '2024-03-02 15:05:38'),
    31. (590813, 990, 133480, 2, '2024-03-02 15:05:38'),
    32. (590823, 990, 133480, 13, '2024-03-02 15:16:02');
    33. COMMIT;

    Мне требуется вывести максимальные id по полю master_id и далее сортировка по дате

    Желаемый результат дает скрипт ниже, но говорят, что так делать не корректно (ошибка синтаксиса подсвечивается), так как поле date нет в значения select.
    Код (Text):
    1. select max(m1.`id`) as id, m1.`master_id` from `test-grp1` m1 where `zakaz_id`='133480' group by m1.`master_id` order by m1.`date` asc
    Если сделать как ниже, то с точки зрения синтаксиса, всё корректно, но скорость обработки страдает.
    Код (Text):
    1. select t2.id,t2.master_id,m2.date from (select max(m1.`id`) as id, m1.`master_id` from `test-grp1` m1 where `zakaz_id`='133480' group by m1.`master_id` ) t2 join `test-grp1` m2 on t2.id=m2.id group by t2.`master_id` order by m2.date
    Какой правильный путь решения?
     
  2. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    82
    Симпатии:
    15
    Есть ли смысл в order by date ? если в теории у тебя должен идти автоинкремент по id

    Код (Text):
    1. SELECT MAX(m1.`id`) AS id, m1.`master_id`
    2. FROM `test-grp1` m1
    3. WHERE `zakaz_id` = '133480'
    4. GROUP BY m1.`master_id`
    ну и про ключи не забыл? используй explain и анализируй запросы
     
  3. shtrih

    shtrih Активный пользователь

    С нами с:
    10 дек 2015
    Сообщения:
    60
    Симпатии:
    3
    этот запрос естественно я пробовал. Его итог отличается от моих запросов.

    Ключи все есть и индексы. Дело не в этом
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Тут тоже не всё в порядке с получаемыми полями и участвующими в группировке. Та же самая ошибка, но про m2.date, т.к. его нет в group by t2.`master_id`.
    Напишите табличку, которую желаете видеть в итоге.
    Может быть дело не в группировке?
    Или можно использовать max(m1.`date`) либо в результатах, либо в сортировке...
    Не говоря уже о том, что просто m1.date включить в группировку. Тогда и сортировка пройдёт без проблем.
    Играйтесь: DB Fiddle (Ваш пример... только агрегатную функцию max к датам применил)
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.096
    Симпатии:
    1.240
    Адрес:
    там-сям
    MySQL вполне законно указывает тебе на ошибку. в старых версиях было послабление насчет группировки, сейчас по умолчанию настройки стали строже, как в других СУБД. то что ты пытаешся сделать это логически неправильно.

    [offtopic] если ничего не делать специально, то сортировка будет по группируемому полю id, наверняка оно растет сонаправлено с date, так что вообще без order by скорее всего ты получишь желаемый результат.[/offtopic]

    но если хочется явно сортировать по дате, то надо сформулироть четко: что именно ты сортируешь.
    вот у тебя есть группа значений, которая будет свернута при группировке:

    -- 5 строк будут свернуты в 1
    (590766, 1, 133480, 1, '2024-03-02 14:33:19'),
    (590767, 1, 133480, 2, '2024-03-02 14:33:19'),
    (590768, 1, 133480, 18, '2024-03-02 14:33:32'),
    (590772, 1, 133480, 6, '2024-03-02 14:35:07'),
    (590787, 1, 133480, 7, '2024-03-02 14:43:42'),
    -- 3 строки будут свернуты в 1
    (590788, 1233, 133480, 1, '2024-03-02 14:44:02'),
    (590789, 1233, 133480, 2, '2024-03-02 14:44:02'),
    (590791, 1233, 133480, 17, '2024-03-02 14:44:25'),

    пять дат и три даты на каждую из этих групп. какую именно дату ты будешь использовать??? ответь на этот вопрос и тогда решение будет очевидно. )))

    подсказка: MIN / MAX / AVG
    вообще странно что ты использовал эттот прием для id, но не догадался применить для date