Как выбрать продукт с многоуровневыми категориями в SQL?

0

Я использую codeigniter и MySQL для создания веб-приложения электронной коммерции. Для этого требовалось три уровня категорий. Поэтому я создал 3 таблицы. Эти are-

категория
category_id, category_name

подкатегория
subcategory_id, subcategory_name, subcategory_category_id

subsubcategory
subsubcategory_id, subsubcategory_name, subsubcategory_subcategory_id

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

product_id, product_name, product_subsubcategory_id

Теперь мне нужен запрос sql для получения всего продукта любой конкретной категории.

Что-то вроде

$this->Mdl_data->select_products_by_category($category_id);

Пожалуйста помоги мне с этим. Я пробовал программирование на PHP, чтобы решить эту проблему. Но это было слишком медленно с множеством вложенных циклов.

  • 0
    Вы должны посмотреть, как сделать запрос хранимой процедурой, которую вы можете встроить в MySQL, а затем вернуть результаты с помощью php.
  • 0
    Это называется "плохой дизайн базы данных"
Показать ещё 2 комментария
Теги:
codeigniter

1 ответ

1
Лучший ответ

Если вам нужно выбрать все продукты, соответствующие определенной категории, попробуйте этот запрос:

SELECT p.product_id, p.product_name, p.subsubcategory_id FROM category c 
JOIN subcategory sc ON sc.subcategory_category_id = c.category_id
JOIN subsubcategory ssc ON ssc.subsubcategory_subcategory_id = sc.subcategory_id
JOIN product p ON p.subsubcategory_id = ssc.subsubcategory_id
WHERE c.category_id = 1;

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

Изменить: ответ на комментарий о том, как улучшить БД.

Текущий дизайн базы данных выглядит корректно, согласно фактическим отношениям данных. 1-много для cat-subcat и 1-many для subcat-subsubcat. Но это приводит к сложным (и возможно медленным) запросам во время использования.

Один из способов, которым я вижу, - реализовать много-много отношений с дополнительным ограничением. Вы можете создать дополнительный подкаст cat cat, как и вы, если вам нужно много-много. Но в этой таблице вы можете установить уникальное ограничение для subcat_id, поэтому каждый субкарт может принадлежать только одному коту, и он становится фактически отношением 1-много. Но в этом случае вы можете перемещать как up-, так и вниз иерархию. Этот подход уменьшит количество JOINs в вашем запросе только на 1, но вся логика запроса будет легче понять.

По-другому. Насколько я понимаю, это запрос для фильтра веб-магазина. Таким образом, новые продукты будут добавляться гораздо реже, чем по категориям. Вы можете просто добавить поля subcat_id и cat_id к вашему продукту, что не является хорошей идеей с точки зрения структуры данных, но для этой конкретной ситуации это может быть хорошим решением. Каждый раз, когда новый продукт вставляется в БД, вы должны контролировать правильность этих двух полей с помощью PHP или всего, что вы используете на сервере. Но при поиске товаров по категориям у вас будет простой запрос без JOINs.

Оба подхода основаны на идее пожертвовать некоторым пространством для ускорения и упрощения запросов, которые часто используются. Может быть, есть еще лучшее решение, но я не могу найти его прямо сейчас.

  • 0
    Это именно то, что я искал. Миллион спасибо за это. Я буду рад, если вы можете рассказать мне о любом источнике для изучения профессионального стиля программирования SQL. Кстати, ты уже спас мою работу.
  • 0
    Я не уверен, что могу вам что-то посоветовать. Я изучал SQL из видео-уроков, ничего особенного. Просто прочитайте инструкции и выполните поиск в стеке.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню