mysql - 选择具有 5/10/15 个匹配关键字的用户

标签 mysql join

我有如下表: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/

相关文章:

php - 仅当 id 不同时才选择列 MySQL

php - MySQL 和 PHP 行数组

javascript - 防止后期数据伪造

php - 如何使MySQL与另一个表中的相同值连接

MySQL 左连接 COUNT() 和 SUM() 与来自同一个表的 CASE

php - 获取组成员的连接查询,然后在 Laravel 中获取组作为查询

PHP 页面无法正确显示

mysql - Database Smell - 使用多个表改进当前设计

mysql - 加入两个子查询抛出错误

MySQL:使用具有多个子元素的连接限制与 FROM 相关的结果