1
jhdxr 2015-03-18 15:40:56 +08:00 1
select *, if(time() >= startData and time() <= endData, 1, if(time() < startData, 2, 3)) as o from actions where ?????? order by o
我觉得你这样子想要一条sql写完性能会死的很惨 |
2
StevenTong OP select actions.*,
if(current_timestamp > actions.startDate and current_timestamp < actions.endDate,1,0) as status, if(current_timestamp < actions.startDate,2,0) as status, if(current_timestamp > actions.endDate,3,0) as status from actions, actions_members where actions_members.m_id = 3 and actions_members.status = "ok" and actions.id = actions_members.t_id order by status asc; 可是3条if怎么写到一起呢? |
3
StevenTong OP 原来是1L这样写
|
4
StevenTong OP @jhdxr 怎么优化好?
|
5
aqqwiyth 2015-03-18 16:04:21 +08:00
变相的分组排序,你是不是还有一个隐性的需求没提出来
union all 我觉得比较适合 selct 活动进行中 union all selct 未开始 union all selct 已结束 |
6
aqqwiyth 2015-03-18 16:04:39 +08:00
这样可以对 活动进行中 / 结束 的进行排序
|
7
jlnsqt 2015-03-18 16:24:58 +08:00
能否修改表结构?若可以增加一个活动的状态字段会更好。不可以就用UNION ALL
|
8
StevenTong OP |
10
jhdxr 2015-03-19 14:04:32 +08:00
@StevenTong 得看你的需求,你是做类似于排行榜那样子确定只有一页的么?
|
11
StevenTong OP @jhdxr 用户可以创建一项团队活动 其他用户可以加入
我创建的 或者我加入的 所有的活动 在APP中 比如有我的活动这一项需要显示所有的与我有关联的 得按照进行中 未开始 已过期排序 就是这样的需求 |
12
jhdxr 2015-03-19 22:32:51 +08:00
@StevenTong 我个人建议你可以拆成3个独立的sql,先只查进行中的,不够再去查未开始的,最后去查过期的。这样子就是翻页是个问题。。。但因为你这业务对时间要求不强(不像拍卖之类的),所以在应用层面去做这个页码的计算应该也ok
|
13
jlnsqt 2015-03-23 15:37:25 +08:00
@StevenTong 不好意思,好几天没上了,可以啊,可以用MySQL本身的定时器,也可以用程序去实现,每隔1秒执行一次修改,如果每秒的任务数量不多的话,这种方式还是可行的
|