我允许用户遵循平台上的某些类别和其他对象。例如,此系统中的每个类别都有一个唯一的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
,则将9
,7
和6
保存到user_tags
表中:
user_tags
user_id | tag_id
---------|-----------
1 | 9
1 | 7
1 | 6
这意味着,如果有人在Cycling (6)
中发布某项内容,以覆盖所有类型的所有骑自行车者,那么它将在Downhill
之后到达用户。
现在,我有feed
和feed_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个标签,则此方法的效率将不够高,因为它是平台的高流量区域。我还认为可能会有更好的查询,而不涉及在循环中构建查询,并且将两个查询都包含在一个查询中,既可以获取用户的标签,又可以交叉引用它们。
是我选择了一种可接受的方法还是可以对其进行改进?如果是这样,如何进行改进?为什么?
答案 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)
您得到的结果仅基于 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