Поиск по нескольким тегам

Автор kak2z, 08 января 2014, 23:36:37

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kak2z

есть три таблицы

1. Файлы
1.1. ИД файла
1.2. Имя файла

2. Теги (добавляю только я и никто больше, больше похоже не на теги, а на меню)
2.1. ИД тега
2.2. Имя тега

3. Связывающая таблица
3.1. ИД файла
3.2. ИД тега


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

но вот допустим есть картинка на которой изображен кот на руках у девушки.
назначаю теги "Кот", "Девушка", "Люди", "Животные".
Тот запрос который я сделал, увы тупо отображает ВСЕ картинки которые относятся к каждому из тегов.
Вот так я это сделал, но потом понял что сделал глупость

SELECT * FROM  agal_tags_links, agal_file_list,  agal_dir_list
WHERE gal_tags_links.id_tag IN ({array_int:filter_on_num}) AND gal_tags_links.id_file=gal_file_list.id_file AND gal_dir_list.id_dir=gal_file_list.id_dir
GROUP BY gal_file_list.id_file
ORDER BY gal_tags_links.id_file ASC
LIMIT 0 , 30

в массиве array_int:filter_on_num перечисляются все теги по которым мне надо отфильтровать картинки.
Но как написал выше - фильтруе, да не так как мне надо.
Помогите составить запрос, который будет не брать ВСЕ картинки относящиеся к каждому тегу, а будет брать картинки у которых совпадают заданные теги.
А то я что то совсем запутался..
Спасибо.

upd: тегов может быть много... 10-20..  это тяжелый запрос наверно будет?
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

GeorG

И всех тоже запутали...

Цитата: kak2z от 08 января 2014, 23:36:37назначаю теги "Кот", "Девушка", "Люди", "Животные"
А если будет другая картинка, в которой будет 3 или 2 совпадающих тега, их выводить не надо и вывести надо только ту где совпадут все 4, или совпадают только заданное количество тегов?
А так все правильно, выводит видимо те, где есть хотя бы один упомянутый тег.
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

kak2z

Цитата: GeorG от 09 января 2014, 00:29:20
И всех тоже запутали...
А если будет другая картинка, в которой будет 3 или 2 совпадающих тега, их выводить не надо и вывести надо только ту где совпадут все 4, или совпадают только заданное количество тегов?
А так все правильно, выводит видимо те, где есть хотя бы один упомянутый тег.


у меня сейчас так.. указываю теги допустим "Кот", "Девушка"

выводят картинки с тегами
Картинка 1 - теги: кот, девушка
Картинка 2 - теги: кот
Картинка 3 - теги: девушка
Картинки 4 - теги: кот, девушка, животные

мне выводится все 4 картинки..
а надо что бы выводилась 1 и 4.
я вроде вот нашел

Есть таблицы posts (id, title, text) и tags (id, name), связанные отношением многие-ко-многим с помощью таблицы posts_tags (post_id, tag_id).

Задача — выбрать посты с определёнными тегами.

Вариант 1:

SELECT p.id, p.title, p.text
FROM posts p
INNER JOIN posts_tags pt1 ON pt1.post_id = p.id
INNER JOIN posts_tags pt2 ON pt2.post_id = p.id
WHERE
    pt1.tag_id = ID_ПЕРВОГО_ТЕГА AND
    pt2.tag_id = ID_ВТОРОГО_ТЕГА

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


Вариант 2:

SELECT p.id, p.title, p.text
FROM posts p
WHERE p.id IN (
    SELECT pt.post_id
    FROM posts_tags pt
    INNER JOIN posts_tags pt1 ON pt.post_id = pt1.post_id AND pt1.tag_id = ID_ПЕРВОГО_ТЕГА
    INNER JOIN posts_tags pt2 ON pt.post_id = pt2.post_id AND pt2.tag_id = ID_ВТОРОГО_ТЕГА
)


Таким способом делает выборку модуль Views в Drupal.


Вариант 3:

SELECT p.id, p.title, p.text
FROM posts p
INNER JOIN posts_tags pt ON pt.post_id = p.id
WHERE pt.tag_id IN (ID_ПЕРВОГО_ТЕГА, ID_ВТОРОГО_ТЕГА)
GROUP BY p.id
HAVING COUNT(*) >= 2


В HAVING указывается количество тегов участвующих в выборке (в примере их два). Таким способом делает выборку модуль Search в Drupal.


но я не могу разобраться что например значит "p" таблицы такой нет.. или что значит например "pt" тоже такой таблицы нет..
и какой вариант более правильный...
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

GeorG

Цитата: kak2z от 09 января 2014, 00:38:27но я не могу разобраться что например значит "p" таблицы такой нет
Псевдоним, без AS

Т.е., можно было написать это:
FROM posts p
так:
FROM posts AS p
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

kak2z

Цитата: GeorG от 09 января 2014, 02:10:20
Псевдоним, без AS

Т.е., можно было написать это:
FROM posts p
так:
FROM posts AS p

Спасибо)) более менее разобрался)) а какой метод более правильный с точки зрения нагрузки на сервер и т.п.?
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)