Поиск с использованием тегов в PHP / MySQL - PullRequest
2 голосов
/ 05 сентября 2011

Я изо всех сил пытаюсь найти решение этой проблемы.У меня есть теги, которые вставляются в базу данных в этой форме

mytags = firsttag, secondtag, thirdtag

На одной странице мне нужно показать связанные элементы на основе этих тегов, так как я использую

SELECT * FROM posts WHERE tags LIKE \"%$mytags%\" ORDER BY views DESC LIMIT 5"

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

Я думал о том, чтобы взорвать mytags и затем искать, используя первый тег в массиве, но это не очень хорошо работает.

Кто-нибудь знает эффективный метод поиска?

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

Почему вы не используете отдельную таблицу для хранения меток?Я имею в виду, например, таблицу «posts», таблицу «tags» и таблицу отношений «posts_tags».Вот структура «записей»:

id
title
content

Вот структура «тегов»:

id
tag_name

А вот структура, если «posts_tags»:

id
post_id
tag_id

Это схема модели отношений «многие ко многим».И теперь вы можете просто найти теги и / или сообщения через оператора JOIN.

1 голос
/ 05 сентября 2011

Возможно, вы захотите взглянуть на find_in_set () , но я также настоятельно рекомендую нормализовать вашу базу данных и использовать правильную структуру.

1 голос
/ 05 сентября 2011

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

Вам необходимо создать еще одну таблицу - Теги , а затем еще одну.для представления связи тегов с сообщениями, скажем, TagsPosts , все предварительно проиндексировано.

0 голосов
/ 05 сентября 2011

Вы всегда должны поддерживать нормализацию своих данных (один фрагмент данных в каждом столбце).Есть решение этой проблемы с использованием двух таблиц;один для тегов и один для сообщений и MySQL LEFT JOIN.Ниже приведен очень минимальный пример.

Таблица posts

id  int(11) Auto Increment   
title   char(255)

Таблица tags

id  int(11)  
postid  int(11)  
tag char(64)

Запрос для поиска сообщений с тегами, содержащими firstpost

(важно)

SELECT p.title FROM posts p
LEFT JOIN tags t
ON t.postid=p.id
WHERE t.tag LIKE '%firstpost%'

Пример данных

INSERT INTO `posts` (`id`, `title`) VALUES
(1, 'Post number 1'),
(2, 'Another post'),
(3, 'Third post');

INSERT INTO `tags` (`id`, `postid`, `tag`) VALUES
(0, 1,  'first_post'),
(0, 1,  'firstpost_secondtag'),
(0, 2,  'secondpost_firsttag');

Как я уже говорил выше, это очень минимальный пример.Самый важный бит здесь - это использование LEFT JOIN и отдельной таблицы тегов.Для вас должно быть очевидно, что вы просто заменяете firstpost в операторе LIKE на переменную PHP.

...