mysql 使用日期和状态字段的订购问题
mysql ordering question using date and status field
需要关于根据日期和状态订购一些 items/events 的最有效方式的想法。
目前我有以下查询。
select tevent.ID, tevent.ename, e_dates.edate, tevent.status, tevent.eactive from tevent
LEFT JOIN e_dates on tevent.ID=e_dates.EID) Where tevent.status <> 'delete' and tevent.eactive ='Y' group by tevent.id order
by (case when tevent.status = 'closed' and e_dates.edate >= curdate() then 0
else 1 end), edates.edate desc
我用了一个案例,但它按状态排序,然后按日期排序,这让人很困惑。
下面是输出
+----+--------------+-----+-----------+
| ID |Edate | Ename | Status |
+----+--------------+-----+-----------+
| 2 | 2018-09-21 | Event2 | Closed |
| 5 | 2018-09-15 | Event5 | Closed |
| 3 | 2018-12-12 | Event3 | Open |
| 6 | 2018-10-25 | Event6 | Approved|
| 4 | 2018-10-25 | Event4 | Open |
| 7 | 2018-10-15 | Event7 | Pending |
| 10 | 2018-10-01 | Event10 | Open |
| 1 | 2018-09-30 | Event1 | Open |
| 4 | 2018-09-30 | Event4 | Open |
| 8 | 2018-09-01 | Event8 | Closed |
| 11 | 2018-08-25 | Event11 | Closed |
+----+--------------+-----+-----------+
已编辑:
我想要完成的是列出事件日期早于事件日期的已关闭事件。 IE(ID 2 和 ID 5)
但是想要按ASC的时间顺序列出OPEN、APPROVED、PENDING的事件状态。
以及事件日期 (edate) 晚于底部列出的当前日期 (now()) 的已结束事件
例如:
+----+--------------+-----+-----------+
| ID |Edate | Ename | Status |
+----+--------------+-----+-----------+
| 2 | 2018-09-21 | Event2 | Closed |
| 5 | 2018-09-15 | Event5 | Closed |
| 1 | 2018-09-30 | Event1 | Open |*
| 4 | 2018-09-30 | Event4 | Open |*
| 10 | 2018-10-01 | Event10 | Open |*
| 7 | 2018-10-15 | Event7 | Pending |*
| 4 | 2018-10-25 | Event4 | Open |*
| 6 | 2018-10-25 | Event6 | Approved|*
| 3 | 2018-12-12 | Event3 | Open |*
| 11 | 2018-08-25 | Event11 | Closed |
| 8 | 2018-09-01 | Event8 | Closed |
+----+--------------+-----+-----------+
我认为你几乎是对的。您的案例陈述中需要三个选项 - 0 表示顶部的所有封闭项,2 表示底部的所有封闭项,1 表示中间的所有其他项。然后删除日期上的 desc 以获得每个部分内升序的日期,因此您的 order by 子句应该看起来像
order by (
case when tevent.status = 'closed' and e_dates.edate >= curdate() then 0
when tevent.status = 'closed' and e_dates.edate < curdate() then 2
else 1 end
), edates.edate
或者你也可以这样写
order by (
case when tevent.status = 'closed'
then case when e_dates.edate >= curdate() then 0 else 2 end
else 1 end
), edates.edate
需要关于根据日期和状态订购一些 items/events 的最有效方式的想法。
目前我有以下查询。
select tevent.ID, tevent.ename, e_dates.edate, tevent.status, tevent.eactive from tevent
LEFT JOIN e_dates on tevent.ID=e_dates.EID) Where tevent.status <> 'delete' and tevent.eactive ='Y' group by tevent.id order
by (case when tevent.status = 'closed' and e_dates.edate >= curdate() then 0
else 1 end), edates.edate desc
我用了一个案例,但它按状态排序,然后按日期排序,这让人很困惑。
下面是输出
+----+--------------+-----+-----------+
| ID |Edate | Ename | Status |
+----+--------------+-----+-----------+
| 2 | 2018-09-21 | Event2 | Closed |
| 5 | 2018-09-15 | Event5 | Closed |
| 3 | 2018-12-12 | Event3 | Open |
| 6 | 2018-10-25 | Event6 | Approved|
| 4 | 2018-10-25 | Event4 | Open |
| 7 | 2018-10-15 | Event7 | Pending |
| 10 | 2018-10-01 | Event10 | Open |
| 1 | 2018-09-30 | Event1 | Open |
| 4 | 2018-09-30 | Event4 | Open |
| 8 | 2018-09-01 | Event8 | Closed |
| 11 | 2018-08-25 | Event11 | Closed |
+----+--------------+-----+-----------+
已编辑: 我想要完成的是列出事件日期早于事件日期的已关闭事件。 IE(ID 2 和 ID 5)
但是想要按ASC的时间顺序列出OPEN、APPROVED、PENDING的事件状态。
以及事件日期 (edate) 晚于底部列出的当前日期 (now()) 的已结束事件
例如:
+----+--------------+-----+-----------+
| ID |Edate | Ename | Status |
+----+--------------+-----+-----------+
| 2 | 2018-09-21 | Event2 | Closed |
| 5 | 2018-09-15 | Event5 | Closed |
| 1 | 2018-09-30 | Event1 | Open |*
| 4 | 2018-09-30 | Event4 | Open |*
| 10 | 2018-10-01 | Event10 | Open |*
| 7 | 2018-10-15 | Event7 | Pending |*
| 4 | 2018-10-25 | Event4 | Open |*
| 6 | 2018-10-25 | Event6 | Approved|*
| 3 | 2018-12-12 | Event3 | Open |*
| 11 | 2018-08-25 | Event11 | Closed |
| 8 | 2018-09-01 | Event8 | Closed |
+----+--------------+-----+-----------+
我认为你几乎是对的。您的案例陈述中需要三个选项 - 0 表示顶部的所有封闭项,2 表示底部的所有封闭项,1 表示中间的所有其他项。然后删除日期上的 desc 以获得每个部分内升序的日期,因此您的 order by 子句应该看起来像
order by (
case when tevent.status = 'closed' and e_dates.edate >= curdate() then 0
when tevent.status = 'closed' and e_dates.edate < curdate() then 2
else 1 end
), edates.edate
或者你也可以这样写
order by (
case when tevent.status = 'closed'
then case when e_dates.edate >= curdate() then 0 else 2 end
else 1 end
), edates.edate