我想要其兴趣与特定事件的兴趣匹配的用户列表。用户或事件可以具有多种兴趣,例如社交,文化等。
我尝试了以下查询来获取用户(志愿者)列表,但是对于我的应用程序来说,它不是动态的,因为事件可以具有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:我是初学者,所以请让我知道我是否做得正确。
答案 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
列表以获得更多兴趣。