Перейти к содержанию

Рекомендуемые сообщения

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

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

 

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

 

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   1 пользователь онлайн

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.