- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как удалить плохие SEO-ссылки и очистить ссылочную массу сайта
Применяем отклонение ссылок
Сервис Rookee
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Всем доброго времени суток!
Прошу помочь с SQL запросом - ибо застрял... :(
... сильно сокращаю реальную структуру, дабы остановиться на сути вопроса...
Есть таблица 'products'
Поля: prod_id, prod_title, prod_cats
В поле prod_cats - ID категорий из другой таблицы, через запятую, например: "2,6,12"
То есть, один продукт может относиться сразу к нескольким категориям.
Вторая таблица: 'cats'
Поля: cat_id, cat_name
Задача: получить количество продуктов в каждой категории, например:
Автомобили (8) / Оргтехника (5) и т.д...
Додумался пока только до такого варианта:
Такой вариант работает некорректно, т.к. не подсчитывает дубли, - то есть возвращает в сумме - количество продуктов в базе, - если продукт подсчитан для одной категории, для другой он уже не считается...
Прошу помочь...
count(prod_id) заменить на count(distinct(prod_id))
хотя минутку
В поле prod_cats - ID категорий из другой таблицы, через запятую, например: "2,6,12"
То есть, один продукт может относиться сразу к нескольким категориям.
Через запятую?
Странно что оно вообще работает как Вы описали, ибо (int)95 не должно быть in (text)(34,95,02), например.
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
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
Остальные побочные задачи так же упростятся.
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 - что бы не считать дубли
siv1987, - FIND ON SET мне и нужен был. Спасибо, - Ваш вариант работает именно так, как нужно...
Всем спасибо большое за помощь!