Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

Как создать правильный запрос в 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 товары которые входят только в оду эту категорию.

 

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

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

      

 

 

 

Link to post
Share on other sites

Допустим:

"Костюм в клетку" - товар с 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

Link to post
Share on other sites

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

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

 

Задача: Написать запрос и в этом случае, то-есть зная только 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;

 

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

Цитата

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

 

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

 

 

Link to post
Share on other sites

от версии зависит.

не ясно, что значит в дополнительных. если в дополнительных = дочерних, то уверен этот запрос уже есть в движке

Link to post
Share on other sites

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

В указанной категории( допустим 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 и т.д.

Link to post
Share on other sites

попробуйте вот так. для своего удобства и самопроверки, использовал стандартные таблицы 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 или что-то похожее. Конечно, она работает на родной структуре БД, на родных табличках. Но Вы можете подсмотреть, как там все устроено и сделать свою функцию с блэкджеком и прочим ;)

Edited by 100napb
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.