【问题标题】:mysql ordering question using date and status field使用日期和状态字段的mysql订购问题
【发布时间】:2018-09-13 15:11:04
【问题描述】:

需要有关根据日期和状态订购某些项目/事件的最有效方式的想法。

目前我有以下查询。

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  |
    +----+--------------+-----+-----------+

【问题讨论】:

  • 我很努力,但我无法理解您的问题。我无法弄清楚您所说的“未通过的已关闭事件”是什么意思,我的任何想法都与您显示的输出不匹配。我还想知道为什么您的 SQL 查询缺少某些部分,例如表达式和表。我已投票结束您的问题,因为不清楚您要问什么。
  • 对不起,我没有说清楚,出于安全原因不想在查询中包含字段名称。让我看看我是否可以编辑它以及更多的查询。
  • 是的,这好多了,但是请再次阅读您所写的内容:“......其中活动日期在活动日期之前......”。以我的经验,“事件日期”与“事件日期”相同,我只能在您的两个表中找到一个日期字段,即:edates.edate。您需要两个日期列来比较某些内容。在您的查询中,您使用当前日期,但您必须说明您打算如何使用它。

标签: mysql sql-order-by


【解决方案1】:

我认为你几乎是对的。您的 case 语句中需要三个选项 - 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

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2010-10-18
    相关资源
    最近更新 更多