MySQL查询以获得类似的喜好
我正在设计一个简单的体系结构,其中我有一个存储用户和他们喜欢的某些元素的表,因此我的表结构如下:MySQL查询以获得类似的喜好,mysql,join,Mysql,Join,我正在设计一个简单的体系结构,其中我有一个存储用户和他们喜欢的某些元素的表,因此我的表结构如下: +---------+---------+ | user_id | like_id | +---------+---------+ | 1 | 4 | | 2 | 2 | | 4 | 4 | | 4 | 3 | | 5 | 4 | | 6 | 7 | |
+---------+---------+
| 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\u id
=1),我需要一个查询来获取所有其他用户,这些用户与1有相似的喜好
因此,在用户的输出中,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
然而,这个查询并没有给出所有用户,它遗漏了用户_id=2,该用户与用户_id=1具有相同的id 3
我不知道如何找到剩下的两列
另外,我觉得这不是最好的方法,因为这个表将包含数千个数据,并且可能会影响系统性能
我想用一个Mysql查询来实现这一点
这假设一个PK是在用户\u id上形成的,比如\u 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;
选择y.user\u id
,组_CONCAT(y.like_id)喜欢
,总数(*)
从我的表x
加入我的桌子
在y.like_id=x.like_id上
和y.user\u id x.user\u id
其中x.user_id=1
团体
按y.user\u id;