搜索带有特定标签的帖子

时间:2019-04-21 11:01:31

标签: mysql sql

我允许用户遵循平台上的某些类别和其他对象。例如,此系统中的每个类别都有一个唯一的tag_id(显示在括号中)。

Billiards (1)
    Pool (2)
        9-Ball (3)
        8-Ball (4)
    Snooker (5)
Cycling (6)
    Mountain Biking (7)
        Cross Country (8)
        Downhill (9)
        Dual Slalom (10)
        Trials (11)
    Road Racing (12)
    Velodrome (13)

如果用户想关注Cycling > Mountain Biking > Downhill,则将976保存到user_tags表中:

user_tags

user_id  | tag_id
---------|-----------
1        | 9
1        | 7
1        | 6

这意味着,如果有人在Cycling (6)中发布某项内容,以覆盖所有类型的所有骑自行车者,那么它将在Downhill之后到达用户。

现在,我有feedfeed_tags表,其中包含所有帖子及其与之关联的标签:

提要

feed_id  | title              
---------|------------------------------------------
1044     | How to get into cross country racing.
1045     | How to get into downhill racing.

feed_tags

feed_id  | tag_id
---------|----------
1044     | 8
1044     | 7
1044     | 6
1045     | 9
1045     | 7
1045     | 6

现在需要根据相关标签在feed表中搜索用户感兴趣的项目。

我的尝试

首先,我得到了用户标签的结果集,并将其缓存以加快每次搜索的速度:

SELECT tag_id FROM user_tags WHERE user_id = 1;

这使我得到以下信息:

tag_id
---------
9
7
6

然后,我遍历用户的标签模型以构建供稿搜索查询的联接部分:

SELECT f.title
FROM feed AS f
// loop start
INNER JOIN feed_tags AS ft1 ON f.feed_id = ft1.feed_id
    AND ft1.tag_id = 9
INNER JOIN feed_tags AS ft2 ON f.feed_id = ft2.feed_id
    AND ft2.tag_id = 7
INNER JOIN feed_tags AS ft3 ON f.feed_id = ft3.feed_id
    AND ft3.tag_id = 6
// loop end

这似乎对我拥有的很少的测试数据有效。上面的查询仅返回一个帖子,“如何进入下坡比赛”。并返回以下两者:

SELECT f.title FROM feed AS f
INNER JOIN feed_tags AS ft1 ON f.feed_id = ft1.feed_id
    AND ft1.tag_id = 6

但是,我担心这不是正确的方法。我担心如果用户关注100个标签,则此方法的效率将不够高,因为它是平台的高流量区域。我还认为可能会有更好的查询,而不涉及在循环中构建查询,并且将两个查询都包含在一个查询中,既可以获取用户的标签,又可以交叉引用它们。

是我选择了一种可接受的方法还是可以对其进行改进?如果是这样,如何进行改进?为什么?

SQLFIDDLE

4 个答案:

答案 0 :(得分:0)

将类别系统更改为简单版本后,我设法自己回答了这个问题。而不是让类别系统中的每个层都是可遵循的,我只是这样使端点可遵循:

Cycling [+]
    Mountain Biking [+]
        Cross Country (8)
        Downhill (9)
        Dual Slalom (10)
        Trials (11)

可以执行以下查询:

SELECT
  f.feed_id,
  f.title
FROM feed AS f
LEFT JOIN feed_tags AS ft ON ft.feed_id = f.feed_id
WHERE ft.tag_id IN (
  SELECT
    tag_id
  FROM user_tags
  WHERE user_id = 1
)
GROUP BY f.feed_id

答案 1 :(得分:-1)

SELECT DISTINCT f.title
FROM feed AS f
INNER JOIN feed_tags AS ft1 ON f.feed_id = ft1.feed_id AND ft1.tag_id in (9,7,6)

您也可以放

SELECT tag_id FROM user_tags WHERE user_id = 1;

in语句中,除非您也在其他地方使用它。

答案 2 :(得分:-1)

demo on dbFiddle

您得到的结果仅基于 user_id 1 tag_id 9 。 因此,对于特定的user_id,您将获得最大tag_id ,并从Feed表中获取标题。

SELECT f.title
FROM feed AS f
INNER JOIN feed_tags AS ft1 
    ON f.feed_id = ft1.feed_id 
    where ft1.tag_id = (
  SELECT max(tag_id) FROM user_tags WHERE user_id = 1
);

以上查询是针对一个user_id的。 如果您有不同的user_id,然后要在查询中使用标题

SELECT f.title,ft1.tag_id
FROM feed AS f
INNER JOIN feed_tags AS ft1 
    ON f.feed_id = ft1.feed_id 
    where ft1.tag_id IN (
  SELECT max(tag_id) FROM user_tags WHERE user_id IN (1,2,3) group by user_id
);

答案 3 :(得分:-2)

$search_data = $_REQUEST['search']; //your search keyword 

$connect = mysqli_connect("localhost","db_user_name","db_user_password","db_name"); //connect your MySQL database

$select_data = "SELECT * FROM all_posts WHERE post_tag  LIKE '%$search_data%'"; //your search data select on your database 

$select = mysqli_query($connect,$select_data); //your search data

$search_array = mysqli_fetch_array($select); //your search data convert to array