简单(?)MySQL查询

时间:2014-03-04 23:03:40

标签: mysql sql

我对MySQL很新,并且一直坚持查询。我以为我必须使用子查询,但这样做不起作用,因为它返回多行。这是我到目前为止所得到的:

    SELECT im.fb_id, im.interest_id, i.name
    FROM interest_map AS im
    LEFT JOIN interests AS i ON i.id = im.interest_id
    WHERE i.category = 'Pet supplies'

这给了我所有在“宠物用品”类别下有兴趣的用户。我想要的是:

  1. 从用户A开始
  2. 收集X类
  3. 下所有用户A的兴趣
  4. 查找所有其他具有匹配兴趣的用户
  5. 兴趣不需要明确匹配,这意味着用户A可以拥有兴趣1,2,4,用户B可以拥有兴趣2,3,5,他们仍然会在兴趣2上匹配。

    我的表格如下:

        users: id, firstname, last_name
        interests: id, name, category
        interest_map: user_id, interest_id
    

    此外,如果有人知道这种查询是什么,所以我可以阅读其他类似的查询,我真的很感激!

2 个答案:

答案 0 :(得分:1)

您可以将 second 表中的条件移动到on子句中来执行此操作:

SELECT im.fb_id, im.interest_id, i.name
FROM interest_map im LEFT JOIN
     interests i
     ON i.id = im.interest_id AND
        i.category = 'Pet supplies';

LEFT JOIN与记录不匹配时,它会生成NULL值。因此,当您说i.cateogry = 'Pet Supplies'时,i.category的值为NULL且比较失败。

将条件放在on子句中可以解决这个问题。但是,它会将所有行保留在初始表中。

我认为你真的想要:

SELECT u.id, im.interest_id, i.name
FROM users u left outer join
     interest_map im
     on u.id = im.user_id LEFT JOIN
     interests i
     ON i.id = im.interest_id AND
        i.category = 'Pet supplies';

这将为每个用户生成一行,并且具有适当的兴趣。

答案 1 :(得分:-1)

那么,您应该阅读所有用户对阵列的兴趣。然后你可以做一个

SELECT * FROM interest_map WHERE interest_id in (array of user A interests)

如果你这样做,你也可以看到谁匹配使用A最多,这意味着你可以做。

SELECT count(*) as nr, user_id FROM interest_map WHERE interest_id in (array of user A interests) GROUP BY user_id ORDER BY nr DESC.

这将按降序为您提供与用户A匹配最多的用户。