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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поиск по тегам [подскажите алгоритм]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Подскажите как организовать поиск по тегам
Frostbite
Отправлено: 07 Сентября, 2014 - 12:30:48
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Есть форма с checkbox'ами, которая представляет собой фильтр тегов.

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

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

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

Соответственно, если пользователь выбрал четыре и больше тегов, там количество комбинаций возрастает Огорчение (ABC, ABD, ACD, AD, BD и т.д.)
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2014 - 12:38:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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


-----
PostgreSQL DBA
 
 Top
Frostbite
Отправлено: 07 Сентября, 2014 - 13:11:11
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Немогли бы вы прояснить как примерно выглядят таблицы в базе для вашего запроса Однако
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2014 - 14:19:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Типичный 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

Но для тегов обычно уместно денормализовать.


-----
PostgreSQL DBA
 
 Top
Frostbite
Отправлено: 07 Сентября, 2014 - 14:34:56
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Насколько я вас понял у вас три таблицы

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

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

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

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

И еще вопрос по SQL запросу. Он повторы постов не выдает?
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2014 - 14:40:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Для второго запроса - да, классические 3 таблицы.

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

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

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

Нет, то гарантирует группировка по post_id.


-----
PostgreSQL DBA
 
 Top
Frostbite
Отправлено: 07 Сентября, 2014 - 15:11:37
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Огромное спасибо за адекватный, полный ответ Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB