按不同列排序表,具体取决于另一列发生的情况

问题描述 投票:0回答:1

这是我第一次问一个问题,英语不是我的母语。我事先为任何拼写错误或行为不端道歉。现在我的问题是:我有一张看起来像这样的桌子。 (图片1)1。每个预订的时间是半小时2.总是有booking_date,小时和分钟3.有些行有delivery_date,有些行还没有4. Delivery_date总是在预订之后_date

unordered table

如果打印出来的那天是例如(2018-12-01),我希望按照查看日期(2018-12-01)订购该表,要么是first_date OR delivery_date,它是第一个。 AND应按每个(小时,分钟)排序。如下所示:(图片2)

Ideal ordered

你可以看到它从01行跳到08然后回到05,然后到02.这是因为它必须按小时和分钟排序。然而,delivery_date具有在行之间跳转的优先级(如第05行)

我试过这个SQL:

SELECT * FROM booking WHERE booking_date=$b_date OR DATE(delivery_date)=$b_date ORDER BY hour, minute ASC, HOUR(delivery_date), MINUTE(delivery_date) ASC

这将给我按小时,分钟正确订购的booking_date,但是delivery_date没有正确订购

然后我也搜索了,在Stackoverflow.com上找到并尝试了这个:

SELECT * FROM booking WHERE booking_date=$b_date OR DATE(delivery_date)=$b_date ORDER BY CASE WHEN booking_date=$b_date THEN hour, minute WHEN DATE(delivery_date)=$b_date  THEN HOUR(delivery_date), MINUTE(delivery_date) END ASC

这给了我以下错误:

查看与您的MySQL服务器版本对应的手册,以便在'分钟附近使用正确的语法时使用(delivery_date)= $ b_date那么在第1行的那一天(delivery_date),MINUTE(delivery_date)END'

那是“小时”之后的逗号。我接受它,它不喜欢逗号,所以我不能使用2列ORDER BY。当我只使用一列时它可以工作,但会议记录错误。有没有办法在ORDER BY中使用2列?

sql sql-order-by case
1个回答
0
投票

THEN子句只能指定一个值。相反,您可以按分钟订购:

SELECT *
FROM booking
WHERE booking_date=$b_date OR DATE(delivery_date)=$b_date
ORDER BY CASE WHEN booking_date=$b_date
                  THEN hour * 60 + minute
              WHEN DATE(delivery_date)=$b_date
                  THEN HOUR(delivery_date) * 60 + MINUTE(delivery_date)
         END ASC
© www.soinside.com 2019 - 2024. All rights reserved.