2012-01-05 3 views
0

У меня есть быстрый вопрос относительно подхода к отображению продуктов в пакете электронной коммерции, который я собираю. Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы, чтобы посетители сайта сузили поиск.PHP, подход к фильтрации электронной коммерции MySQL

Например, случай использования будет:

  1. Посетитель в настоящее время просматривают сезон продуктов
  2. Он/Она должна затем иметь возможность фильтровать по категориям и марки (например, летние коллекции.) в течение этого сезона, так, например, они могут решить, что они хотят видеть только брюки из одежды Galore.

Проблема заключается в том, что выполнение одного запроса SQL для поиска продуктов, соответствующих всем трем из этих факторов (поэтому продукт находится в летней коллекции, представляет собой пару штанов и изготовлен по одежде изобилие). То, что делает это чрезмерно трудным, состоит в том, что продукты могут быть в нескольких категориях и сезонах. Таким образом, для получения правильного результата потребуется соединение безумной суммы.

Моя структура базы данных выглядит следующим образом:

product -> product_category <- category 
product -> product_season <- season 
product <- brand (a product can only be made by one brand) 

Надежда кто-то может поделиться своей мудростью на этом ...

+0

Ваша структура таблицы отличается неопределенной. Если product_season и product_category уже являются частью таблицы продуктов, зачем вам вообще нужно присоединяться? Я предполагаю, что они делят category_id и season_id или что-то в этом роде. Я напишу ответ в этом предположении. – James

+0

Эй, извините, что предполагалось быть отрывочной ERD. Product_category и product_season представляют собой связующие объекты между продуктом и соответствующей таблицей соединения (например, категория или сезон). Надеюсь, что это немного облегчит. –

+0

Вот что я думал. Я предполагаю, что они являются полями в обеих таблицах, которые одинаковы? Я не уверен. – James

ответ

1

Если у вас есть большой каталог, вы можете быть лучше использовать Apache Solr (http://lucene.apache.org/solr/). В противном случае существует несколько подходов.

Вам не нужны накладные и прямые SQL не то, что с ума, будет выполнять достаточно хорошо:

SELECT product.* 
FROM product 
LEFT JOIN product_category 
LEFT JOIN category 
LEFT JOIN product_season 
LEFT JOIN season 
WHERE season = ? AND category = ? 

В качестве альтернативы, если вам не нравится количество возвращаемых строк, вы можете агрегировать категория и сезон в таблицу продукта (новые столбцы), а затем использовать как запросы, чтобы найти вещи:

SELECT product.* 
FROM product 
where product.categories like '% category %' 
    and product.seasons like '% season %' 
+0

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

+0

Убедитесь, что вы правильно указали свои поля в своей СУБД. – amccausl

+0

ok ... все мои первичные ключи индексируются. И имя продукта, которое является единственным столбцом, в котором выполняется поиск. А затем, очевидно, совокупные столбцы, которые вы предлагали. Это верно? –

0
Select product.* From product 
    Left Join product_category On (product.product_id = product_category.product_id) 
    Left Join product_season On (product.product_id= product_season.product_id) 
    Left Join brand On (product.product_id = brand.product_id) 
    Where product_category.category_id = '$catId' 
    And product_season.season_id = '$seasonId' 
    And brand.brand_id = '$brandId' 
     Order By product.product_name 

Хорошо, это предполагает product, product_category, product_season, brand, season, category все столы. Вы должны передать идентификаторы таблицы season и category непосредственно из того, что вы используете, чтобы отфильтровать поиск, чтобы вам не пришлось присоединяться к этим таблицам.

+0

Спасибо за ответ ... Я рассматривал этот подход, но тот факт, что я использую Active Record для создания своих запросов, делает это не очень удобным для меня. Мне также нужно добавить разбивку на страницы и упорядочивание на лету, и я не хочу, чтобы конкатенировать строки вместе повсюду, чтобы построить запрос. –

Смежные вопросы