Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Поиск по тегам [подскажите алгоритм]
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Поиск по тегам [подскажите алгоритм]

Страниц (1): [1]
 

1. Frostbite - 07 Сентября, 2014 - 12:30:48 - перейти к сообщению
Есть форма с checkbox'ами, которая представляет собой фильтр тегов.

Мне нужно произвести поиск по тегам, рассортированый по приоритету.

Пример:
Пользователь выбрал теги A, B, C

Первыми идут посты у которых есть все теги (ABC)
Вторыми идут посты у которых есть хотя бы два из них (AB, BC, AC)
Последними идут посты у которых есть хотя бы один тег (A, B, C)

Соответственно, если пользователь выбрал четыре и больше тегов, там количество комбинаций возрастает Огорчение (ABC, ABD, ACD, AD, BD и т.д.)
2. Мелкий - 07 Сентября, 2014 - 12:38:39 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT post_id, count(0) AS tags_match FROM posts_tags WHERE tag_id IN ('a','b','c') GROUP BY post_id ORDER BY tags_match DESC
3. Frostbite - 07 Сентября, 2014 - 13:11:11 - перейти к сообщению
Немогли бы вы прояснить как примерно выглядят таблицы в базе для вашего запроса Однако
4. Мелкий - 07 Сентября, 2014 - 14:19:41 - перейти к сообщению
Типичный 1:М.
posts_tags:
post_id int unsigned, foreign key to posts.id
tag_id varchar (сколько нравится) /*tag_id по опечатке, по смыслу tag_name должен быть*/

Если по учебнику, то делать надо не менее классический М:М.
posts_tags:
post_id int unsigned, foreign key to posts.id
tag_id int unsigned, foreign key to tags.id
Tags:
id int unsigned auto_increment,
name varchar(сколько надо)
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT post_id, count(0) AS tags_match FROM posts_tags JOIN tags ON tag_id=tags.id WHERE tags.name IN ('a','b','c') GROUP BY post_id ORDER BY tags_match DESC

Но для тегов обычно уместно денормализовать.
5. Frostbite - 07 Сентября, 2014 - 14:34:56 - перейти к сообщению
Насколько я вас понял у вас три таблицы

Таблица постов:
posts: id и т.д.

Таблица тегов:
tags: tag_id, tag_name и т.д.

Связующая таблица:
links: id, post_id, tag_id

Я вас правильно понял?

И еще вопрос по SQL запросу. Он повторы постов не выдает?
6. Мелкий - 07 Сентября, 2014 - 14:40:26 - перейти к сообщению
Для второго запроса - да, классические 3 таблицы.

Frostbite пишет:
links: id, post_id, tag_id

Зачем здесь поле id?

Frostbite пишет:
И еще вопрос по SQL запросу. Он повторы постов не выдает?

Нет, то гарантирует группировка по post_id.
7. Frostbite - 07 Сентября, 2014 - 15:11:37 - перейти к сообщению
Огромное спасибо за адекватный, полный ответ Улыбка

 

Powered by ExBB FM 1.0 RC1