【问题标题】:Sort results by expiration date with expired at the end按过期日期对结果进行排序,最后过期
【发布时间】:2020-04-30 02:37:27
【问题描述】:

我正在使用 Mysql 和 PHP。我需要根据到期日期对结果进行排序。未过期的结果在前,升序排列,过期的在最后。

我正在使用以下查询:

SELECT * FROM `promos` ORDER BY `expire_date` ASC LIMIT 0,10

例如,考虑这些值:

ID  expire_date
1   2020-05-07 03:30:00
2   2020-05-03 17:00:00
3   2020-04-28 23:30:00
4   2020-05-12 09:00:00
5   2020-03-29 12:00:00
6   2020-04-17 15:00:00

我需要得到以下订单:

ID  expire_date
2   2020-05-03 17:00:00  / ASC
1   2020-05-07 03:30:00  / ASC
4   2020-05-12 09:00:00  / ASC
3   2020-04-28 23:30:00  / DESC EXPIRED
6   2020-04-17 15:00:00  / DESC EXPIRED
5   2020-03-29 12:00:00  / DESC EXPIRED

如何使用 MySQL 和 PHP 有效地实现这一目标?

【问题讨论】:

  • “但现在我需要在最后显示过期的促销活动”您需要更具体。还显示您尝试过的其他事情,以便我们为您的问题提供更好的背景。
  • @JordanS 是的,我考虑过,但我尝试的一切都没有结果。就是这样,按到期日期排序,但在最后显示过期的...
  • 您能举一个例子,为您的表格提供一些值吗?你拥有的结果和你想要的结果......

标签: php mysql sorting


【解决方案1】:

您可以在ORDER BY 中添加一个条件表达式,当expire_date 已通过时返回1,否则返回0;这将导致过期值在最后排序:

SELECT * 
FROM `promos` 
ORDER BY `expire_date` < CURDATE(), `expire_date` ASC
LIMIT 0,10

要对过期日期进行排序降序,您需要先按expire_date 升序排序(如果未过期),然后按expire_date 降序排序:

SELECT *
FROM `promos` 
ORDER BY CASE WHEN `expire_date` >= CURDATE() THEN `expire_date`
              ELSE '9999-99-99' 
         END ASC,
         `expire_date` DESC
LIMIT 0,10

Demo on dbfiddle

【讨论】:

  • 啊,我倒过来试过了,还是不行! ...现在,是否可以按降序对过期的进行排序? (保持当前的升序)
  • @Manuel23 看到我的编辑。那应该做你想做的。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 2012-11-23
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多