PHP标签系统和搜索系统

时间:2018-05-06 10:15:38

标签: php mysql search tags

我正在开发一个简单的标签产品系统和搜索系统。 我尝试了一些爆炸和数组的方法,但我无法使它工作。

我有3张桌子

  1. tags id title
  2. posts_tags postid tagid
  3. posts
  4. 有没有解决方案,所以我可以用sql语句进行多标签搜索,或者只用一个标签?我只想制作一个搜索系统,以便用户可以通过一个或多个标签搜索帖子。

2 个答案:

答案 0 :(得分:0)

//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是您要搜索其标签的帖子的ID

希望有所帮助

答案 1 :(得分:0)

要将SQL用于此类应用程序,您需要搜索匹配的标记,然后对其进行计数。

例如,如果您希望标记为JulyBeach的帖子的ID值,则可以执行此操作。

       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

看到它的诀窍?当您尝试匹配多个匹配项时,您需要计算与标记匹配的数量。