我对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'
这给了我所有在“宠物用品”类别下有兴趣的用户。我想要的是:
兴趣不需要明确匹配,这意味着用户A可以拥有兴趣1,2,4,用户B可以拥有兴趣2,3,5,他们仍然会在兴趣2上匹配。
我的表格如下:
users: id, firstname, last_name
interests: id, name, category
interest_map: user_id, interest_id
此外,如果有人知道这种查询是什么,所以我可以阅读其他类似的查询,我真的很感激!
答案 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匹配最多的用户。