Я использую 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, чтобы решить эту проблему. Но это было слишком медленно с множеством вложенных циклов.
Если вам нужно выбрать все продукты, соответствующие определенной категории, попробуйте этот запрос:
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.
Оба подхода основаны на идее пожертвовать некоторым пространством для ускорения и упрощения запросов, которые часто используются. Может быть, есть еще лучшее решение, но я не могу найти его прямо сейчас.