我有如下表:user(id, name)、interests(id,interest) 和 users_interests(user_id,interest_id)。
我想查找具有给定数量的匹配兴趣的所有用户。
假设有 4 个用户:(mike、andre、julian、john)。其中 2 人有 3 个匹配的兴趣。例如,mike(音乐、体育、游戏)、andre(音乐、体育、游戏)。其他 2 个用户有不同的兴趣。我需要一个查询,该查询将为我提供具有 2 个匹配兴趣的所有用户(2 是可变的)。结果将是迈克和安德烈。
最佳答案
请注意,这个答案大量借用 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
但是,除非您的数据集非常小,否则至少可以说,这通常是一个不切实际的查询。
关于mysql - 选择具有 5/10/15 个匹配关键字的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520504/