Jump to content
Sign in to follow this  
IhorDod

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

 

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

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

      

 

 

 

Share this post


Link to post
Share on other sites

правильно заданный вопрос содержит половину ответа

Share this post


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

Share this post


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;

 

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

Цитата

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

ой бида

Попробуйте еще раз сформулировать задание.


 

Share this post


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 и т.д.

Share this post


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.