Прошу помочь с SQL запросом

artalex
На сайте с 08.12.2005
Offline
144
392

Всем доброго времени суток!

Прошу помочь с SQL запросом - ибо застрял... :(

... сильно сокращаю реальную структуру, дабы остановиться на сути вопроса...

Есть таблица 'products'

Поля: prod_id, prod_title, prod_cats

В поле prod_cats - ID категорий из другой таблицы, через запятую, например: "2,6,12"

То есть, один продукт может относиться сразу к нескольким категориям.

Вторая таблица: 'cats'

Поля: cat_id, cat_name

Задача: получить количество продуктов в каждой категории, например:

Автомобили (8) / Оргтехника (5) и т.д...

Додумался пока только до такого варианта:

SELECT `cat_id`, `cat_name`, COUNT(`prod_id`) AS `prods_count` FROM `cats` LEFT JOIN `products` ON `cats`.`cat_id` IN (`products`.`prod_cats`) GROUP BY `cats`.`cat_id`

Такой вариант работает некорректно, т.к. не подсчитывает дубли, - то есть возвращает в сумме - количество продуктов в базе, - если продукт подсчитан для одной категории, для другой он уже не считается...

Прошу помочь...

edogs software
На сайте с 15.12.2005
Offline
775
#1

count(prod_id) заменить на count(distinct(prod_id))

хотя минутку

artalex:
В поле prod_cats - ID категорий из другой таблицы, через запятую, например: "2,6,12"
То есть, один продукт может относиться сразу к нескольким категориям.

Через запятую?

Странно что оно вообще работает как Вы описали, ибо (int)95 не должно быть in (text)(34,95,02), например.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
siv1987
На сайте с 02.04.2009
Offline
427
#2

SELECT cat_id, cat_name, COUNT(*) as count FROM cats LEFT JOIN products ON FIND_IN_SET(cat_id, prod_cats) GROUP BY cat_id

или

SELECT cat_id, cat_name, (SELECT COUNT(*) FROM products WHERE FIND_IN_SET(cat_id, prod_cats)) as count FROM cats

edogs software
На сайте с 15.12.2005
Offline
775
#3
siv1987:
SELECT cat_id, cat_name, COUNT(*) as count FROM cats LEFT JOIN products ON FIND_IN_SET(cat_id, prod_cats) GROUP BY cat_id

или

SELECT cat_id, cat_name, (SELECT COUNT(*) FROM products WHERE FIND_IN_SET(cat_id, prod_cats)) as count FROM cats

По уму Вам надо делать решение many2many.

Т.е. вводить дополнительную таблицу типа relationships product_id, cat_id

И убирать prod_cats из products.

Тогда все выборки упростятся и это будет стандартное решение.

Ваша задача тогда будет решаться простым

select cat_id, count(product_id) from relationships as a left join cats as b on a.cat_id=b.cat_id group by cat_id

Остальные побочные задачи так же упростятся.

siv1987:
SELECT cat_id, cat_name, COUNT(*) as count FROM cats LEFT JOIN products ON FIND_IN_SET(cat_id, prod_cats) GROUP BY cat_id

Если все же не менять структуру, то скорее так

select cat_id, cat_name, count(distinct(prod_id)) as count from cats left join products on find_in_set(cat_id,prod_cats) group by cat_id

Тут ключевое - dictinct - что бы не считать дубли

artalex
На сайте с 08.12.2005
Offline
144
#4

siv1987, - FIND ON SET мне и нужен был. Спасибо, - Ваш вариант работает именно так, как нужно...

Всем спасибо большое за помощь!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий