Всем привет. Хотел разобраться с ошибкой "column must appear in the GROUP BY clause or be used in an aggregate function" при написание скриптов. Ошибка мне понятно. Есть таблица Код (Text): CREATE TABLE`test-grp1`( `id` int(100) NOT NULL DEFAULT '0', `master_id` int(11) NOT NULL, `zakaz_id` int(11) NOT NULL, `status_id` int(11) NOT NULL, `date` datetime NOT NULL ); -- -- Dumping data for table `test-grp1` -- INSERT INTO `test-grp1` (`id`, `master_id`, `zakaz_id`, `status_id`, `date`) VALUES (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'), (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'), (590795, 1159, 133480, 1, '2024-03-02 14:48:02'), (590796, 1159, 133480, 2, '2024-03-02 14:48:02'), (590801, 1159, 133480, 11, '2024-03-02 14:55:46'), (590807, 1122, 133480, 1, '2024-03-02 15:00:48'), (590808, 1122, 133480, 2, '2024-03-02 15:00:48'), (590811, 1122, 133480, 17, '2024-03-02 15:05:12'), (590812, 990, 133480, 1, '2024-03-02 15:05:38'), (590813, 990, 133480, 2, '2024-03-02 15:05:38'), (590823, 990, 133480, 13, '2024-03-02 15:16:02'); COMMIT; Мне требуется вывести максимальные id по полю master_id и далее сортировка по дате Желаемый результат дает скрипт ниже, но говорят, что так делать не корректно (ошибка синтаксиса подсвечивается), так как поле date нет в значения select. Код (Text): 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): 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 Какой правильный путь решения?
Есть ли смысл в order by date ? если в теории у тебя должен идти автоинкремент по id Код (Text): SELECT MAX(m1.`id`) AS id, m1.`master_id` FROM `test-grp1` m1 WHERE `zakaz_id` = '133480' GROUP BY m1.`master_id` ну и про ключи не забыл? используй explain и анализируй запросы
этот запрос естественно я пробовал. Его итог отличается от моих запросов. Ключи все есть и индексы. Дело не в этом
Тут тоже не всё в порядке с получаемыми полями и участвующими в группировке. Та же самая ошибка, но про m2.date, т.к. его нет в group by t2.`master_id`. Напишите табличку, которую желаете видеть в итоге. Может быть дело не в группировке? Или можно использовать max(m1.`date`) либо в результатах, либо в сортировке... Не говоря уже о том, что просто m1.date включить в группировку. Тогда и сортировка пройдёт без проблем. Играйтесь: DB Fiddle (Ваш пример... только агрегатную функцию max к датам применил)
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