我正在设计一个简单的架构,我有一个存储用户和一些他们喜欢的元素的表,所以我的表结构是这样的:
+---------+---------+
| user_id | like_id |
+---------+---------+
| 1 | 4 |
| 2 | 2 |
| 4 | 4 |
| 4 | 3 |
| 5 | 4 |
| 6 | 7 |
| 7 | 5 |
| 34 | 6 |
| 3 | 8 |
| 2 | 3 |
| 2 | 5 |
| 1 | 3 |
| 1 | 10 |
| 1 | 12 |
| 2 | 10 |
+---------+---------+
现在我将拥有任何用户的id
(假设user_id
= 1),我想要一个查询来获得与1相似的所有其他用户。
因此,在user_id = 1的输出中将是:
+---------------------------+------------------------+----------------+
| users_with_common_likes | no_of_common_likes | common_likes |
+---------------------------+------------------------+----------------+
| 4 | 2 | 3,4 |
| 2 | 2 | 3,10 |
| 5 | 1 | 4 |
+---------------------------+------------------------+----------------+
我取得的成就: 我可以使用如下的子查询来执行此操作:
SELECT user_id
FROM `user_likes`
WHERE `like_id`
IN (
SELECT GROUP_CONCAT( `like_id` )
FROM user_likes
WHERE user_id =1
)
AND user_id !=1
LIMIT 0 , 30
然而,这个查询没有给所有用户,它错过了user_id = 2,它与user_id = 1具有相同的id 3。
我无法弄清楚如何找到剩余的2列。
此外,我觉得这不是最佳方法,因为此表将包含数千个数据,并且可能会影响系统性能。
我想用一个Mysql查询来完成这个。
答案 0 :(得分:1)
这假定在user_id上形成PK,like_id ...
SELECT y.user_id
, GROUP_CONCAT(y.like_id) likes
, COUNT(*) total
FROM my_table x
JOIN my_table y
ON y.like_id = x.like_id
AND y.user_id <> x.user_id
WHERE x.user_id = 1
GROUP
BY y.user_id;