我有以下表:user(id,name),interest(id,interest)和users_interests(user_id,interest_id)。
我想查找具有给定数量的匹配兴趣的所有用户。
假设有4位用户:(迈克,安德烈,朱利安,约翰)。其中2个有3个匹配的兴趣。例如,迈克(音乐,体育,游戏),安德烈(音乐,体育,游戏)。其他2个用户有不同的兴趣。我需要一个查询,它将给我所有用户2个匹配的兴趣(2是变量)。结果将是迈克和安德烈。
答案 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
但是,除非你的数据集很小,否则至少可以说这是一个普遍不切实际的问题。