【问题标题】:select user with 5/10/15 matching keywords选择具有 5/10/15 匹配关键字的用户
【发布时间】:2014-04-26 13:29:38
【问题描述】:

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

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

假设有 4 个用户:(mike、andre、julian、john)。其中 2 个有 3 个匹配的兴趣。例如,mike(音乐、运动、游戏)、andre(音乐、运动、游戏)。其他 2 个用户有不同的兴趣。我需要一个查询,它会给我所有具有 2 个匹配兴趣的用户(2 个是可变的)。结果将是迈克和安德烈。

【问题讨论】:

标签: mysql join


【解决方案1】:

请注意,此答案大量借鉴 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

但除非您的数据集非常小,否则至少可以说这是一个通常不切实际的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多