Форма поиска MySQL PHP с несколькими категориями нескольких флажков - PullRequest
0 голосов
/ 24 октября 2011

Поначалу это кажется слишком простым, чтобы быть проблемой, но все равно есть.

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


Какие ваши любимые цвета?

[] Красный

[] Синий

[] Желтый

Какие ваши любимые фрукты?

[] Apple

[] Оранжевый

[] Банан


Задача № 1

Если пользователь проверяет красный и синий - извлекаем ли мы из базы данных строки, которые соответствуют только обоим? Или мы включаем строки, которые также соответствуют только красный или только синий? По моему мнению, конечный пользователь может ожидать увидеть один или другой результат, или оба!

Проблема № 2

Имея в виду, что CMS, которую я должен использовать, хранит данные в массивах для каждого вопроса. Таким образом, компания A для первого вопроса может иметь значения «Red | Blue» или «Red» или «Red | Blue | Yellow» и т. Д. - плюс то, что у формы, которая у меня есть, есть 10 категорий в каждой по крайней мере с 5 флажками - как я могу перевести это в эффективный и оптимизированный запрос, не прибегая к if / else mish mash?

Любая помощь высоко ценится.

Ответы [ 2 ]

1 голос
/ 24 октября 2011
  1. Очень вероятно, что это конъюнкция (красная или синяя), а не дизъюнкция (красная и синяя), но это зависит от семантики вопроса. Если вы даете варианты, которые могут происходить одновременно, то вам может понадобиться дизъюнкция.

  2. Я не вижу лучшего способа, чем что-то вроде

    $ colors = $ POST ["color []"];
    $ items = array ();

    foreach ($ colors как $ color) {

    $ items [] = "'$ color' IN colors";

    }

    $ SQL. = "AND (" .implode ('OR', $ items). ")";

0 голосов
/ 24 октября 2011

Для P2 я бы сделал таблицу «многие ко многим» и использовал бы запрос с оператором IN.Для P1, что-то вроде ex: красный, синий, белый

select id,color,count(color) as occurrences from table inner join table_attributes where color in ('red','blue','white') order by occurrences

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...