选择5/10/15匹配关键字的用户

时间:2014-03-19 23:38:17

标签: mysql join

我有以下表:user(id,name),interest(id,interest)和users_interests(user_id,interest_id)。

我想查找具有给定数量的匹配兴趣的所有用户。

假设有4位用户:(迈克,安德烈,朱利安,约翰)。其中2个有3个匹配的兴趣。例如,迈克(音乐,体育,游戏),安德烈(音乐,体育,游戏)。其他2个用户有不同的兴趣。我需要一个查询,它将给我所有用户2个匹配的兴趣(2是变量)。结果将是迈克和安德烈。

1 个答案:

答案 0 :(得分:0)

请注意,此答案大量借鉴an answer to a very similar question

SELECT
    i.user_id,
    GROUP_CONCAT(i.interest ORDER BY i.interest) AS common_interests
FROM
    (SELECT u_i.user_id, i.interest
    FROM interest AS i
    JOIN users_interests AS u_i 
    ON i.id = u_i.interest_id) AS i
        JOIN
        (SELECT u_i.user_id, i.interest
    FROM interest AS i
    JOIN users_interests AS u_i 
    ON i.id = u_i.interest_id) AS i2
        ON i.interest = i2.interest
        AND i.user_id != i2.user_id
GROUP BY i.user_id , i2.user_id
HAVING COUNT(i.interest) = 3;

http://sqlfiddle.com/#!2/dcff0/6

我添加common_interests列只是为了说明GROUP_CONCAT()函数对此类案例的有用性。没有必要为函数添加一个订单,但是如果你想进一步深入兔子洞并查看聚合结果,例如“所有共享兴趣集及其相应用户”,那么它可能会很有用:

http://sqlfiddle.com/#!2/dcff0/21

但是,除非你的数据集很小,否则至少可以说这是一个普遍不切实际的问题。