@sarathorn
php программист, веб-дизайнер, коллекционер

Как извлечь из MySQL данные по нескольким критериям силами PHP?

Доброго времени суток!
Пишу на PHP интернет-магазин, сейчас делаю фильтры для товаров. Допустим, заходите вы в салон Toyota и говорите "покажите мне белый Highlander". И вам показывают модель Highlander именно белого цвета.
В таблице с товарами есть ячейка filters, её содержимое - перечисление id фильтров через запятую. Допустим, для варианта "белый" соответствует id 1, а для "highlander" - 2. У белого хайлендера в filters будет написано "1,2". При этом, может быть и что-то вроде "1,2,3,4,5,6,7" - кто знает сколько разных фильтров будет у товара.

запрос к БД выглядит так:
$filters="[[:<:]]1[[:>:]] | [[:<:]]2[[:>:]]"; //пробелы для визуального разграничения - сливается
$query="SELECT * FROM table WHERE filters REGEXP '$filters'";

Этот запрос выводит все товары, которые имеют 1 в списке и все с 2 в списке. То есть, нам показываются все машины белого цвета и хайлендеры всех цветов.

Модернизация запроса до:
$filter=array(0 => "[[:<:]]1[[:>:]]", 1=>"[[:<:]]2[[:>:]]");
$query="SELECT * FROM table WHERE filters REGEXP '$filter[0]' AND filters REGEXP '$filter[1]'";

решает проблему... То есть, под каждый фильтр дописывается ещё один REGEXP... Если использовать не более двух-трёх фильтров при выборке, полагаю, нагрузка на mysql сервер будет в пределах нормы, но если таких regexp'ов будет 20-30-40?

Собственно вопрос: есть ли красивый выход из ситуации? Заранее спасибо.
  • Вопрос задан
  • 3113 просмотров
Решения вопроса 1
viktorvsk
@viktorvsk
Серьезно. Вот Вы потратили 5, 10, 20, 100 часов что б реализовать вот это. Потом - время на написание вопроса. В конце еще написали
Собственно вопрос: есть ли красивый выход из ситуации?

То есть, в такой формулировке, вы предполагаете, что возможен вариант, что красивого выхода не существует (хотя, мне и сложно представить, каким бы был мир в таком случае)... И Вы даже не решили сначала, как это любят говорить менеджеры в наше время, проинвестигейтить этот вопрос? Действительно, Вам кажется, что может быть вариант, что, например, Ebay - имеет у себя пару петабайт регулярных выражений?

Я просто оставлю это здесь:
en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%...
zlob.in/2013/03/fasetnaya-poisk-v-internet-magazine
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
shaks
@shaks
Я не побоюсь выразить наверное то, что крутится у многих на языке, кто прочел это) - Это пиздец, дружище ) Большой, кромешный пиздец )
Выход из ситуации. - nosql. Забудь про Мускул. Сделай все на mongodb например. Все данные хранить в древовидных коллекциях. Вобщем почитай, как раз все твои проблемы решаться оч легко и изящно.

NoSql позволит тебе в одной коллекции (аля таблице) хранить как автомобили с их характеристиками, так и туалетную бумагу, домашних животных и разные сорта вятского кваса.

Upd А по сабжу, если уж на мускуле делать, то нужно делать через связи has_many и/или has_and_belongs_to_many/has_many through, а не лепить айди через запятую и искать регулярками.

Т.е. есть таблица товаров. Есть таблица фильтров, и есть соединяющая таблица товаров и фильтров.
У каждого товара есть id, у каждого фильтра есть id, а в соединяющей таблице пишутся id'ы товаров и фильтров. Таким образом ты получишь нужную тебе связь.
Если ты чувствуешь что делаешь чтото не так, то скорей всего так оно и есть :) С таким подходом как у тебя, теряется вся логическая цепочка, мускул сойдет с ума, ибо не будет ведать что он творит )
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Следует понимать, что EAV - не панацея, а несколько наоборот - постоянная боль пониже спины.
Во-первых, если в реляционной модели за целостностью данных может следить СУБД, то здесь вся работа ложится на программиста.
А уж получив в том же EAV хотя бы пару-тройку уровней вложенности, можно начинать заранее строить себе стену, об которую потом захочется убиться.

А во-вторых, проблему поиска EAV не решает от слова "совсем". Искать надо другими средствами, например - сфинксом.
И вот тут на первый план выходит не удобство хранения, а удобство построения RT индекса. От которого и надо плясать.
Ответ написан
Комментировать
gluck59
@gluck59
Виртуальный глюк
Вы замучаетесь поддерживать и развивать эту колбасу с баянами уже через полгода.
Возьмите готовый бесплатный движок интернет-магазина. Практически в любом есть то что вам нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы