запрос к базе данных на основе динамического количества условий - PullRequest
0 голосов
/ 23 марта 2012

Я строю систему тегов.Я процитировал его, потому что это не совсем система тегов, но достаточно близко.

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

Проблема, с которой я сталкиваюсь, заключается в том, как именно это сделать.

Есть два способа сделать это, но я был бы очень признателен, если бы кто-то мог объяснить правильный путь.

способ 1) Выполните индивидуальный запрос для каждоготеги затем сортировать / объединять / играть с данными позже.путь 2)

SELECT i2t.item_id
FROM Item2Tag i2t
INNER JOIN Tag t
ON i2t.tag_id = t.tag_id
WHERE t.tag_text IN ('beach','cloud','waves')
GROUP BY i2t.item_id

Выше мой запрос.Это основано на модифицированной версии решения Toxi.Надеюсь, вы видите, что происходит ... по сути, есть 3 таблицы, 1 для информации, 1 для тегов и еще одна для их соединения.

Это то, чем я сейчас занимаюсь: я заменяю «пляж», «облако», «волны» переменной.Затем в коде PHP я преобразовываю массив в строку с каждым словом, разделенным запятыми, и просто вставляю его в запрос.что-то вроде:

foreach ($tagarray as $tag){
$string = .$tag1.", " }

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

Итак, $ string становится равным 'tag1, tag2, tag3'

SELECT i2t.item_id
FROM Item2Tag i2t
INNER JOIN Tag t
ON i2t.tag_id = t.tag_id
WHERE t.tag_text IN ('$string')
GROUP BY i2t.item_id

Есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 23 марта 2012

Структура базы данных хороша с этими 3 таблицами. Но есть небольшая проблема с вашим запросом. Не синтаксис один ты. Давайте возьмем пример. пользователи ищут контент с тегами «а» и «б». Если у вас есть контент только с тегом «а», в результате он появится. Также содержимое только с тегами «b». Вы должны добавить к запросу что-то вроде:

СЧЕТЧИК (t.tag_id) = x

, где x - длина номеров тегов, с которыми вы запрашиваете (в моем примере 2, в вашем 3). Таким образом, контент будет считаться результатом, если все элементы данного набора были сопоставлены. Это работает, только если в одной из этих таблиц нет повторяющихся записей.

Также вместо цикла используйте implode.

$string = implode(",", $tagarray);

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

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