Система тегов PHP и поисковая система - PullRequest
0 голосов
/ 06 мая 2018

Я работаю над простой системой тегов и поисковой системой. Я попробовал несколько методов с разнесением и массивами, но я не мог заставить его работать.

У меня есть 3 таблицы

  1. tags id title
  2. posts_tags постид тагид
  3. posts

Есть ли какое-либо решение, чтобы я мог выполнять поиск по нескольким тегам с помощью операторов SQL или только по одному тегу? Я просто хочу создать поисковую систему, чтобы пользователи могли искать сообщения по одному или нескольким тегам.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

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

Например, если вы хотите, чтобы значения идентификаторов постов были помечены как July и Beach, вы можете сделать это.

       SELECT pt.post_id
         FROM posts_tags pt
         JOIN tags t ON t.id = pt.tag_id
        WHERE t.title IN ('July','Beach')
        GROUP BY pt.post_id
       HAVING COUNT(*) = 2

В предложении HAVING требуются оба тега, а в предложении IN () упоминаются заголовки тегов.

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

       SELECT pt.post_id, COUNT(*) score
         FROM posts_tags pt
         JOIN tags t ON t.id = pt.tag_id
        WHERE t.title IN ('June', 'July', 'August', 'Beach')
        GROUP BY pt.post_id
        ORDER BY COUNT(*) DESC

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

SELECT match.score, posts.column, posts.column, posts.colun
  FROM posts
  JOIN (
       SELECT pt.post_id, COUNT(*) score
         FROM posts_tags pt
         JOIN tags t ON t.id = pt.tag_id
        WHERE t.title IN ('June', 'July', 'August', 'Beach')
        GROUP BY pt.post_id
       ) match ON posts.id = match.post_id
 ORDER BY match.score DESC

Видите хитрость с этим? Вам нужно посчитать количество совпадений с тегами, когда вы пытаетесь сопоставить несколько.

0 голосов
/ 06 мая 2018
//You can join tables
SELECT tags.*, posts.* FROM posts LEFT JOIN posts_tags ON posts.id = posts_tags.postid LEFT JOIN tags ON tags.id = posts_tags.tagid WHERE posts_tags.postid  = '$post_id'

Где $ post_id - идентификатор сообщения, в котором вы хотите найти теги

Надеюсь, это поможет

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