设计场景如下:
目前有一个活动发布和参与的功能,采用laravel框架实现的,一共有两个表来保存业务数据:
表一:events
用于发布活动信息,每个活动用户均可自由参与
id | titlle |
---|---|
1 | 活动 1 |
2 | 活动 2 |
表二:active
用于记录参与活动的用户记录
ID | user_id |
---|---|
1 | 888 |
2 | 999 |
目前的需求如下:
1、分别列出参与活动的用户数据和未参与活动的用户明细(用户总数据单独有一个user表)
2、根据参与活动人数的多少,对活动进行动态排名
自我尝试办法:
对于已参加活动的用户明细,可以直接从active表获取,但是想要查询出某一项活动未参与用户的列表,通过join关联查询时候,如果去判断关联值为null的话,会造成全表扫描,而且数据量大的情况下,加载时间非常高。
不知道还有什么办法能更高效的实现这个办法,或者借助其他一些外部插件实现均可。
没有很明白你的表结构,你给出的两个表结构应该是不全的,或者说不是最佳设计。
一般活动-用户的参与结构是多对多,应该有个中间关联表,除非你只有一个活动..
活动表:actives:id,title,...
用户表:users:id,name,...
活动-用户关联表:active_user: id,user_id,active_id,包含两个外键。
这样一来,查询某一活动id为1的参与用户数据为
select * from users inner join active_user on users.id = active_user.user_id where active_id = 1
或者
select * from users where id in (select user_id from active_user where active_id = 1)
未参与用户就改成,这样不用join
select * from users where id not in (select user_id from active_user where active_id = 1)
自己比对一下哪种速度快。如果还是慢,就要用redis之类的缓存一下每个活动的用户信息了。