【问题标题】:Order by with condition and with field按条件和字段排序
【发布时间】:2022-01-26 08:44:29
【问题描述】:

我想将今天已安排日期的行设置为状态 2,如果今天未安排日期,我希望状态 1、2、3 的结果基于创建时间。我怎样才能把它放在查询中?

这是表格示例

table1
id | scheduled_date        | status | created_at
1  | null                  | 1      | 2021-12-20 00.00.00
2  | 2021-12-27 00.00.00   | 2      | 2021-12-19 00.00.00
3  | 2021-12-26 00.00.00   | 3      | 2021-12-23 00.00.00
4  | null                  | 1      | 2021-12-15 00.00.00

这是我目前尝试过的查询

SELECT *
FROM `table1`
WHERE `status` <> 0
ORDER BY CASE WHEN date(scheduled_date) = '2021-12-27' AND status = 2 then 1 END ASC,
         FIELD(status, 1, 2, 3) ASC,
         `created_at` ASC

但是我得到了行4,1,2,3的结果我想要行2,4,1,3的结果

任何帮助将不胜感激。我也在尝试在 laravel 上执行此操作,所以如果它的雄辩的查询非常受欢迎。

【问题讨论】:

  • 你真的把 2021-12-27 的日期写成未加引号的吗?
  • 是的,我也试过引用它,但结果是一样的
  • ... CASE WHEN date(scheduled_date) = 2021-12-27 and status = 2 then 1 END asc, ... 你比较date(scheduled_date) 和算术表达式2021-12-27 = 1982。必须是... CASE WHEN date(scheduled_date) = '2021-12-27' and status = 2 then 1 END asc, ...,阅读dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html
  • @Akina 就像我说的那样,即使我引用它,它也会显示相同的结果。无论如何,我会用引号编辑我的帖子
  • 由于您按升序排列CASE,因此ELSE 部分中的null(因为您省略了ELSE 部分)实际上位于1 之前案例

标签: mysql sql laravel eloquent


【解决方案1】:

我想将今天已安排日期的行设置为状态 2,如果今天未安排日期,我希望状态 1、2、3 的结果基于创建时间。

测试一下

ORDER BY CASE WHEN DATE(scheduled_date) = '2021-12-27' AND status = 2 
              THEN 0
              ELSE status  -- or FIELD(status, 1, 2, 3)
              END,
         created_at

【讨论】:

  • 这行得通。谢谢@Akina
【解决方案2】:

首先,使用布尔表达式:

DATE(scheduled_date) = '2021-12-27' AND status = 2

ORDER BY 子句中,然后是简单的statuscreated_at

ORDER BY DATE(scheduled_date) = '2021-12-27' AND status = 2 DESC,
         status,
         created_at

请参阅demo

【讨论】:

  • scheduled_date 中为 NULL 的行将无条件放置在最后...而 OP 似乎主要需要根据 status 值对它们进行排序。
  • @Akina 检查我提供的演示。空值不会无条件地放在最后。
  • 我遇到了Unrecognized keyword. (near "status" at position 119) 的错误,我认为这与我正在使用的 MySQL 不兼容
  • @Jovs 我提供了一个演示,您可以在其中看到代码是有效的 MySql 语法。你确定你使用的是准确的代码吗?
  • 是的,我使用的是准确的代码。在AND 之后,我在状态上有红色下划线表示语法不起作用。我也尝试过提交
【解决方案3】:

我认为空值在这里造成了麻烦。你可以试试下面的

select *
  from `table1`
where `status` <> 0
order by CASE WHEN date(scheduled_date) = '2021-12-27' and status = 2 then 1 
              ELSE 2 
          END asc,
         FIELD(status, 1, 2, 3) asc,
         `created_at` asc

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多