Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Научите как составить запрос / 7 сообщений из 7, страница 1 из 1
20.08.2014, 10:19:36
    #38724122
Научите как составить запрос
Есть таблицы products, product_categories (для связки - product_id, category_id), categories (id, title)
Есть массив с filter в котором id категорий для отбора

Надо отобрать категории которых ещё нет в массиве отбора, для продуктов у которых есть все категории из отбора.

Например

Товар1 - категории - 1, 2, 3, 4, 10, 11
Товар2 - категории - 2, 4, 7, 10
Товар3 - категории - 1, 3, 7

Отбор - 2, 4

Результат -
1 => title1
3 => title3
7 => title7
10 => title10
11 => title11

Из Товара1 и Товара 2

---

Я так понимаю, что надо делать две выборки.
Первая из product_categories по условия (category_id IN filter) с результатом $products в виде массива product_id
Вторая из product_categories по условия (product_id IN $products) с группировкой по category_id и соединением с categories.

Не могу сообразить как выделить продукты категории которых полностью в отборе. Идея только сгруппировать первый запрос по product_id и вывести поле COUNT(*), которое должно быть равно count(filter), что и проверять при формировании products.

Как сделать это красиво?
...
Рейтинг: 0 / 0
20.08.2014, 11:11:47
    #38724193
Научите как составить запрос
Список соответствующих отбору продуктов получается выбрать по такому запросу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT * 
  FROM products
  LEFT OUTER JOIN (
    SELECT product_categories.product_id as id, COUNT(*) as count
    FROM product_categories
    WHERE product_categories.category_id IN :filter
    GROUP BY product_categories.product_id
  ) as cat
  ON (products.id = cat.id)
  WHERE (cat.count = :filter_count)
')

Где:
  ':filter' = $filter
  ':filter_count' = count($filter)
...
Рейтинг: 0 / 0
20.08.2014, 11:12:28
    #38724197
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Научите как составить запрос
Синицын АлександрНе могу сообразить как выделить продукты категории которых полностью в отборе. Идея только сгруппировать первый запрос по product_id и вывести поле COUNT(*), которое должно быть равно count(filter), что и проверять при формировании products.
Код: sql
1.
2.
3.
4.
5.
select idproduct
from products2categories
where idcategory in (список ид категорий)
group by 1 
having count(*) = количество категорий в списке
...
Рейтинг: 0 / 0
20.08.2014, 11:19:49
    #38724208
Научите как составить запрос
авторЗдесь прошли люди! Здесь прошли люди... люди... я их найду! ЛЮДИ!!! ("Чародеи" - Гость с Юга)

Помогите дилетанту.
...
Рейтинг: 0 / 0
20.08.2014, 11:25:00
    #38724221
Научите как составить запрос
tanglir,

Спасибо. Так лучше. Часть задачи есть.
...
Рейтинг: 0 / 0
20.08.2014, 11:28:08
    #38724224
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Научите как составить запрос
Синицын АлександрЧасть задачи естьа дальше выбрать (дистинкт) категории, относящиеся к полученным товарам
и потом убрать с помощью "нот ин" ненужные категории
...
Рейтинг: 0 / 0
20.08.2014, 11:41:24
    #38724249
Научите как составить запрос
tanglir,

ЗАРАБОТАЛО!!!

Со вчерашнего дня мучаюсь... Сам бы ещё полдня умирал

ОГРОМНОЕ СПАСИБО :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Научите как составить запрос / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]