MySQL Query获得类似的喜欢

时间:2015-10-29 13:43:57

标签: mysql join

我正在设计一个简单的架构,我有一个存储用户和一些他们喜欢的元素的表,所以我的表结构是这样的:

+---------+---------+
| 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查询来完成这个。

1 个答案:

答案 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;