我用的mysql,
team_activity -团活动表
team_id | start_time | end_time | people_num | goods_id |
---|---|---|---|---|
1 | 2020-4-1 11:00:00 | 2020-4-1 12:00:00 | 10 | 10 |
2 | 2020-4-1 11:00:00 | 2020-4-1 15:00:00 | 5 | 15 |
3 | 2020-4-1 11:00:00 | 2020-4-1 16:00:00 | 3 | 18 |
team_found -具体的团表,
found_id | team_id | join-已参加人数 | status 状态0-待成团;1-拼团成功,2-拼团失败; | |
---|---|---|---|---|
1 | 1 | 6 | 0 | |
2 | 1 | 3 | 0 | |
3 | 2 | 3 | 0 | |
4 | 2 | 5 | 1 |
怎样查出来这种结果,前端需要一个list,团活动商品展示。顺带着,把某个活动的,参团人数最多的具体团id,也要带过去。如果,某个活动没有开团,是0
list需要这种结果:
team_id | goods_name | goods_id | found_id |
---|---|---|---|
1 | 苹果 | 10 | 1 |
2 | 橘子 | 15 | 4 |
3 | 黄瓜 | 18 | 0 |
实际表比这个复杂些,我简化了。
活动team_id=1,是团苹果,然后经过查询,发现有2个团,再团这个苹果,团最多的人数是6,对应的具体团found_id=1
活动team_id=2,是团橘子,然后经过查询,发现有2个团,再团这个橘子,团最多的人数是5,对应的具体团found_id=4
活动team_id=3,是团黄瓜,然后经过查询,发现有0个团,再团这个黄瓜,团最多的人数是0,对应的具体团found_id=0 ,就是没有人开黄瓜团,所以是0。
还有一种特殊情况,如果参与人数最多的团,有多个团,目前参团人数都相等,那么随机取一个具体团id。比如团活动是5,团商品玫瑰,发现目前有2个团在团,并且参团人数还相等。那只能随机取一个,或者可以这样,limit 1,就取第1条的found_id。
搞半天弄不出来,太笨了。
一般这种情况,我是用php,先拆分这个需求,先读出所有团活动列表,然后再foreach循环判断,里面再嵌套sql,逐个比较。目前看来比较low。要执行很多次sql语句,效果低下。现在想用,sql语句一下查出来。
select t.team_id,t.goods_id,t.people_num,f.team_id,f.join,f.found_id
,g.* from ls_goods g left join ls_team_activity t on g.id = t.goods_id and t.del=0 left join (select id as found_id,team_id,max(
join
) asjoin
FROM ls_team_found GROUP BY team_id) f on f.team_id = t.team_id我搞出来一个这个,好像是对了,还差点,要处理一下 null