Надо посчитать одним запросом сколько мастеров для каждого города, почему подсчёт не объединяется и как это сделать? Код (Text): CREATE TABLE `master_user` ( `id` int(10) UNSIGNED NOT NULL, `user_id` int(11) NOT NULL, `master_id` int(11) NOT NULL, `city_id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Дамп данных таблицы `master_user` -- INSERT INTO `master_user` (`id`, `user_id`, `master_id`, `city_id`) VALUES (15, 16, 3, 4019), (18, 16, 5, 4019), (19, 16, 4, 4019), (20, 16, 2, 4019), (21, 17, 4, 4019), (22, 17, 2, 4400); -- -- Индексы сохранённых таблиц -- -- -- Индексы таблицы `master_user` -- ALTER TABLE `master_user` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `master_user` -- ALTER TABLE `master_user` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=23; COMMIT; Код (Text): SELECT master_id, COUNT(*) FROM master_user WHERE city_id = 4019 GROUP BY id
И группировать по городу (id города), и лишнее условие убрать, и id мастера в результате выборки заменить на id (или название, полученное после связки с таблицей-словарём городов) города. И учесть, что хоть mysql не всегда (в зависимости от настроек) ругается, если в выборку включаются данные, неоднозначно соответствующие правилам группировки, всё-таки не надо этим злоупотреблять ввиду высокой вероятности получения данных, не полностю отражающих сложившуюся ситуацию.
Не понимаю, почему не работает, когда я присоединяю ещё одну таблицу? Почему-то ругается на этот join Код (Text): LEFT JOIN category_letter_master ON category_letter_master.masters_id = master_user.master_id Код (Text): Статический анализ: Найдено 2 ошибок при анализе. Этот тип предложения ранее анализировался. (near "LEFT JOIN" at position 233) Неизвестный оператор. (near "LEFT JOIN" at position 233) SQL запрос: SELECT master_user.master_id, masters.specialization, COUNT(*) FROM master_user LEFT JOIN masters ON master_user.master_id = masters.id WHERE city_id = 4019 LEFT JOIN category_letter_master ON category_letter_master.masters_id = master_user.master_id GROUP BY master_user.master_id Ответ MySQL: #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'LEFT JOIN category_letter_master ON category_letter_master.masters_id = master_' на строке 5 Вот так работает Код (Text): SELECT master_user.master_id, masters.specialization, COUNT(*) FROM master_user LEFT JOIN masters ON master_user.master_id = masters.id WHERE city_id = 4019 GROUP BY master_user.master_id А если добавить ещё один join, то не работает, почему? Код (Text): -- -- Структура таблицы `category_letter_master` -- CREATE TABLE `category_letter_master` ( `id` int(10) UNSIGNED NOT NULL, `category_letter_id` int(11) NOT NULL, `master_id` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Дамп данных таблицы `category_letter_master` -- INSERT INTO `category_letter_master` (`id`, `category_letter_id`, `master_id`) VALUES (1, 1, 1), (2, 4, 2), (3, 5, 3), (4, 17, 4), (5, 17, 5), (7, 12, 7); -- -- Индексы сохранённых таблиц -- -- -- Индексы таблицы `category_letter_master` -- ALTER TABLE `category_letter_master` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `category_letter_master` -- ALTER TABLE `category_letter_master` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; COMMIT; --- Добавлено --- Код (Text): -- -- Структура таблицы `masters` -- CREATE TABLE `masters` ( `id` int(10) UNSIGNED NOT NULL, `specialization` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Дамп данных таблицы `masters` -- INSERT INTO `masters` (`id`, `specialization`) VALUES (1, 'Алмазная резка'), (2, 'Гипсокартон'), (3, 'Двери'), (4, 'Пол'), (5, 'Потолок'), (7, 'Кладка'); -- -- Индексы сохранённых таблиц -- -- -- Индексы таблицы `masters` -- ALTER TABLE `masters` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `masters` -- ALTER TABLE `masters` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; COMMIT;
@miketomlin Сделал, заработало, теперь при выборке добавил category_letter_master.category_letter_id, и выдаёт ошибку Код (Text): #1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'prorab.category_letter_master.category_letter_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by Гугл не помог. Вот так работает Код (Text): SELECT master_user.master_id, masters.specialization, COUNT(*) FROM master_user LEFT JOIN masters ON master_user.master_id = masters.id LEFT JOIN category_letter_master ON category_letter_master.master_id = master_user.master_id WHERE city_id = 4019 GROUP BY master_user.master_id Вот так ошибка Код (Text): SELECT master_user.master_id, masters.specialization, category_letter_master.category_letter_id, COUNT(*) FROM master_user LEFT JOIN masters ON master_user.master_id = masters.id LEFT JOIN category_letter_master ON category_letter_master.master_id = master_user.master_id WHERE city_id = 4019 GROUP BY master_user.master_id
Именно об этом я и упоминал чуть ранее. Поле, не включенное в group by и не входящее ни в одну из агрегатных функций (sum, count, avg...). Тут либо добавить группировку по этому полю, либо использовать его в качестве параметра агрегатной функции. --- Добавлено --- В общем, опять так не любимый Вами туториал (один из): Предложение GROUP BY
@Sail Вот так заработало, только не полностью понимаю, как Код (Text): SELECT master_user.master_id, masters.specialization, category_letter_master.category_letter_id AS aaa, COUNT(*) FROM master_user LEFT JOIN masters ON master_user.master_id = masters.id LEFT JOIN category_letter_master ON category_letter_master.master_id = master_user.master_id WHERE city_id = 4019 GROUP BY master_user.master_id, aaa
Нужно теперь посчитать, количество людей не для города, а для страны и региона и я решил, что бы не писать огромный sql запрос, сделать для этого отдельные таблицы. При указании, когда пользователь указывает свой город, то в таблицу записывается ид странны и ид юзера и потом просто подсчитать, сколько пользователей в этой стране и так же для региона. Нормальный способ? --- Добавлено --- О, у меня же есть таблица master_user, вот и её и можно расширить, добавив в неё ид страны и ид города, и немного изменить запрос и всё.