@Tupoleff
Фрилансер, Joomla-сайты

Нестандартная выборка данных из 2-х таблиц, как составить?

Оптимизирую код для интернет магазина.
У каждого товара есть обязательные параметры
- категория
- производитель
Соответственно, есть 2 таблицы со следующими столбцами

Таблица А
-----------------------------
product_id   category_id
-----------------------------

Таблица B
-----------------------------
product_id   manufacturer_id
-----------------------------

При выполнении следующего запроса:
SELECT a.category_id AS id, COUNT(*) AS p_count
FROM a
JOIN b ON a.product_id=b.product_id
WHERE b.manufacturer_id = 'Мелкософт'
GROUP BY id

Получаю таблицу с выборкой типа:
-----------------------------
id		p_count
-----------------------------
Памперсы	15
Лопаты		11
Грабли		25
Тапочки		8
-----------------------------

В списке не все категории а только те в которых есть товары от Мелкософт, и количестов товаров от Мелкософт в каждой указанной категории. Т.к. COUNT(*) показывает только результат отличный от NULL список категорий получется неполный.

ЗАДАЧА
Получить таблицу с ПОЛНЫМ списком категорий. Для тех категорий, где нет товаров от Мелкософт в поле count записывать 0
Примерно так
-----------------------------
id		p_count
-----------------------------
Памперсы	15
Гвозди		0
Шурупы		0
Лопаты		11
Грабли		25
Тапочки		8
Гайки		0
Топоры		0
-----------------------------


Задача легко решается через 2 запроса и PHP скрипт. Но хотелось бы красиво - одним запросом. Заодно лучше освоить SQL.
Запросов к БД в коде сайта немало, кода тоже порядочно и хотелось бы сокращтить и то и другое, попутно повышая свой проф уровень.

Помогите, пожалуйста! =)
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
Ermako
@Ermako
Data Scientist
Делаем LEFT JOIN и присоединяем только тех, у кого нужный производитель, но не через WHERE, а через условие в JOIN и делаем count по правой таблице. Если никого не нашлось, то там будут только значения NULL, а count(поле) выдает количество not null значений, а не всех.
SELECT a.category_id AS id, COUNT(b.product_id) AS p_count
FROM a
LEFT JOIN b ON a.product_id=b.product_id and b.manufacturer_id = 'Мелкософт'
GROUP BY id
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
вместо join- left join. учите sql
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы