Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Как создать правильный запрос в SQL?


Recommended Posts

Коллеги, день добрый. 

Помогите, плиз, написать правильный запрос к БД.

 

Есть такая задача:

 

 

Реализовать схем таблица БД когда один товар может иметь несколько категорий, но всегда должен иметь одну главную

То есть продукт “Костюм в клетку” может иметь главную категорию “Костюмы” но также иметь дополнительные категории “Одежда”, “Для мужчин”, “Акции и скидки

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

 

Я создал 3 таблицы. 

 

1. categories

        id

        slug

        name

2. products

        id

        name

        price

3. products_categories

        product_id

       categorie_id

       index_categorie ( здесь указываю id главной категории)

 

Я знаю как написать запрос  чтоб получить по id товары которые входят только в оду эту категорию.

 

А как написать если этот товар встречается в других категориях? 

Помогите хоть советом куда смотреть.

      

 

 

 

Надіслати
Поділитися на інших сайтах


Допустим:

"Костюм в клетку" - товар с ID 1

"Костюмы" - категория с ID 11

"Одежда" - категория с ID 12

"Акции и скидки" - категория с ID 13

 

Тогда в связывающей таблице будет три записи:

| product_id | category_id |

| 1          | 11          |

| 1          | 12          |

| 1          | 13          |

Запрашиваем все товары нужно категории (например, костюмы c ID 11)

SELECT `product_id` FROM `product_to_category` WHERE `category_id` = 11

Получим ID товаров, входящие в категорию с ID 11

Надіслати
Поділитися на інших сайтах

Согласен, не прав. Уточню.

ТЗ не мое и составлено заказчиком.

 

Задача: Написать запрос и в этом случае, то-есть зная только id категории получить список товаров которые размещены не только в своих главных категориях, и в дополнительных.

 

Все остальное (все что уже сделал) описано выше.

 

Вот мой запрос 

 

SELECT * FROM products 
  inner join products_categories 
  on products.id = products_categories.product_id 
  inner join categories 
  on products_categories.categorie_id = categories.id where categorie_id = 1;

 

Но это я получаю товар который есть в в этой категории ( например ОДЕЖДА). А как выполнить условие 

Цитата

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

 

ВОт тут у меня ступор. 

 

 

Надіслати
Поділитися на інших сайтах


Если я верно понял, то надо

В указанной категории( допустим ID категории = 20) перебирать товары

Спойлер
 
 
 
Полные тексты product_id category_id main_category
Изменить Копировать Удалить 28 20 1
Изменить Копировать Удалить 28 24 0
Изменить Копировать Удалить 29 20 1
Изменить Копировать Удалить 29 24 0
Изменить Копировать Удалить 30 20 1
Изменить Копировать Удалить 30 33 0
Изменить Копировать Удалить 31 33 1
Изменить Копировать Удалить 32 34 1
Изменить Копировать Удалить 33 20 1
Изменить Копировать Удалить 33 28 0
Изменить Копировать Удалить 34 34 1
Изменить Копировать Удалить 35 20 1
Изменить Копировать Удалить 36 34 1
Изменить Копировать Удалить 40 20 1
Изменить Копировать Удалить 40 24 0
Изменить Копировать Удалить 41 27 1
Изменить Копировать Удалить 42 20 1
Изменить Копировать Удалить 42 28 0
Изменить Копировать Удалить 43 18 1
Изменить Копировать Удалить 43 20 0
Изменить Копировать Удалить 44 18 1
Изменить Копировать Удалить 44 20 0

 
           

Если товар привязан только к данной категории, то его пропускаем

( товар с ID = 35 пропускаем)

Если товар привязан еще к другим категориям, то что-то делаем (например, просто выводим Название и ID товара или в таблице Название и ID товара, и ID всех категорий, где он выводится),

Например,( для категории с ID = 20) товары с ID 28, 30, 33, 40 и т.д.

Надіслати
Поділитися на інших сайтах


попробуйте вот так. для своего удобства и самопроверки, использовал стандартные таблицы oc. Уверен, под свои таблички подгоните. Результаты удобно, например, explode'ить, что бы разобрать из строки на отдельные значения

Spoiler

SELECT
  p.model AS 'product model name'
  ,(SELECT GROUP_CONCAT(optc.category_id) FROM oc_product_to_category optc WHERE optc.product_id = p.product_id) AS 'ALL product catergories'
FROM oc_product p,
     oc_product_to_category pc,
     oc_category c
WHERE p.product_id = pc.product_id
AND c.category_id = pc.category_id
GROUP BY  p.product_id HAVING COUNT(*) > 1
ORDER BY 2 ASC

 

на выходе результат вроде такого - в строке перечислены все категории, в которые входит каждый продукт

Spoiler

image.png.11c4769d317e935d439a804feb9783e5.png

 

 

А вообще, freelancer должен быть прав - в ОС 100% есть функция типа getProductCategories или что-то похожее. Конечно, она работает на родной структуре БД, на родных табличках. Но Вы можете подсмотреть, как там все устроено и сделать свою функцию с блэкджеком и прочим ;)

Змінено користувачем 100napb
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.