复杂的MySQL查询 - 查找重复的PER user_id?

时间:2011-10-23 05:25:48

标签: mysql sql

我有一个来自几个人的Facebook赞的数据库。许多“user_id”中存在重复的“like_id”字段。我想要一个查询,它会找到“like_id”的人A与人B的共同点。

这个查询非常适合比较只有2个“user_id”在数据库中的喜欢,但是只要我添加第3个,它就会混乱。基本上,我想看看谁与人A有最多的“喜欢”。

  SELECT *, 
         COUNT(*)
    FROM likes
GROUP BY like_id
  HAVING COUNT(*) > 1

任何人都有可能有效的查询吗?

2 个答案:

答案 0 :(得分:1)

这个SQL应该可行。您只需要输入用户A的user_id,它应该与所有其他用户进行比较并显示最匹配的用户。您可以将其更改为显示前5名或执行您需要执行的任何操作。

基本上它正在做的是它在表上进行自联接,但确保当它进行连接时,它是一个不同的user_id,但“like”是相同的。然后它由每个其他user_id组成一个组,并为该user_id汇总相同数量的喜欢。

SELECT  all_other_likes.user_id, count(all_other_likes.like_id) AS num_similar_likes
FROM    likes original_user_likes
JOIN    likes all_other_likes
ON      all_other_likes.user_id != original_user_likes.user_id
AND     original_user_likes.like_id = all_other_likes.like_id
WHERE   original_user_likes = USER_ID_YOU_WANT_TO_COMPARE
GROUP BY all_other_likes.user_id
ORDER BY count(all_other_likes.like_id) DESC
LIMIT 1;

不确定您使用的数据库。如果它是MS-SQL,您可能需要执行SELECT TOP 1,但这是有效的PostgreSQL和MySQL语法。

答案 1 :(得分:0)

我认为这样做会:

SELECT
  likes_a.user_id,
  likes_b.user_id 
FROM
  likes as likes_a JOIN likes as likes_b
ON
  likes_a.like_id = likes_b.like_id 
WHERE
  likes_a.user_id <> likes_b.user_id

然后对结果进行后期处理,以计算最常见的人。