获取其兴趣与事件的兴趣相匹配的用户

时间:2019-03-31 10:05:13

标签: mysql sql laravel

我想要其兴趣与特定事件的兴趣匹配的用户列表。用户或事件可以具有多种兴趣,例如社交,文化等。

我尝试了以下查询来获取用户(志愿者)列表,但是对于我的应用程序来说,它不是动态的,因为事件可以具有1个或多个兴趣。以下查询仅适用于2个兴趣。

SELECT a.user_id 
FROM user_interests a, user_interests b 
WHERE 
    a.user_id = b.user_id 
    AND a.interest = 'Social'
    AND b.interest = 'Technical';

每个活动将没有活动所需的志愿者。假设有一个事件(a,b,c)。 因此,首先,应用程序将搜索具有所有兴趣(即a,b,c)的志愿者。如果找不到所需的志愿者,则它将搜索有兴趣的用户(a或b或c)。

我的模式是:

user(id,name,..)
user_interests(id, user_id, interest)
event(id,name,..)
event_interests(id, event_id, interest)

因此,请建议我如何针对上述情况编写查询,以使其具有动态性,并获得具有匹配兴趣的user_id列表。

我正在Laravel 5.7上构建应用程序。因此,也欢迎基于laravel的查询或RAW SQL查询。

PS:我是初学者,所以请让我知道我是否做得正确。

2 个答案:

答案 0 :(得分:0)

您可以使用聚合:

SELECT user_id 
FROM user_interests
WHERE interest IN ('Social', 'Technical')
GROUP BY user_id
HAVING COUNT(*) = 2

这假设(user_id,interest)元组在表user_interest中是唯一的。如果不是这种情况,您可以将COUNT(*)更改为COUNT(兴趣不同)。

答案 1 :(得分:0)

如果您要查找志愿者,请按匹配兴趣的数量排序,然后:

SELECT ui.user_id 
FROM user_interests ui join
WHERE ui.interest IN ('Social', 'Technical')
GROUP BY ui.user_id
ORDER BY COUNT(*) DESC
LIMIT <n>;

您可以扩展IN列表以获得更多兴趣。