Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过两种不同的排序方式对MySQL结果进行排序?_Mysql_Sorting - Fatal编程技术网

如何通过两种不同的排序方式对MySQL结果进行排序?

如何通过两种不同的排序方式对MySQL结果进行排序?,mysql,sorting,Mysql,Sorting,首先,我为这个糟糕的问题标题道歉,我不能很好地解释我的问题是什么,但我相信有经验的MySQL用户会知道的 查询数据库以检索特定的客户集后,它们最初按“已完成”列排序,值为“0”和“1” 我想按交货日期ASC对值为“0”的所有客户进行排序,按交货日期DESC对值为“1”的所有客户进行排序 这是我第一次也是唯一一次失败的尝试: mysql_query("SELECT * FROM users WHERE (completed='0' ORDER BY delivery ASC) AND (compl

首先,我为这个糟糕的问题标题道歉,我不能很好地解释我的问题是什么,但我相信有经验的MySQL用户会知道的

查询数据库以检索特定的客户集后,它们最初按“已完成”列排序,值为“0”和“1”

我想按交货日期ASC对值为“0”的所有客户进行排序,按交货日期DESC对值为“1”的所有客户进行排序

这是我第一次也是唯一一次失败的尝试:

mysql_query("SELECT * FROM users WHERE (completed='0' ORDER BY delivery ASC) AND (completed='1' ORDER BY delivery DESC)") or die(mysql_error());

这可以通过以下方式使用
子句中的
case when
来实现

SELECT * FROM users   
order by 
case 
 when completed='0' then delivery
end,
case 
 when completed='1' then delivery
end desc;
如果您需要在顶部发送所有
completed='0'
,假设没有空值,那么您可以执行以下操作

order by 
completed,
case 
  when completed='0' then delivery
end,
case 
  when completed='1' then delivery
end desc;

这可以通过以下方式使用
子句中的
case when
来实现

SELECT * FROM users   
order by 
case 
 when completed='0' then delivery
end,
case 
 when completed='1' then delivery
end desc;
如果您需要在顶部发送所有
completed='0'
,假设没有空值,那么您可以执行以下操作

order by 
completed,
case 
  when completed='0' then delivery
end,
case 
  when completed='1' then delivery
end desc;

第一个排序字段是
completed
ASC
-当然结束了

对于第二个字段,您可以使用一个表达式,使
delivered
的值按需要排序。假设列
delivered
的类型为
DATE
DATETIME
UNIX\u TIMESTAMP(delivered)
是一个数字

对于
completed='0'
按升序使用
UNIX\u时间戳(已交付)
。对于
已完成的“0”
,使用反数值(
-UNIX\u TIMESTAMP(delivered)
)也已排序
ASC
,结束将颠倒行的顺序

以下是查询:

SELECT *
FROM users
ORDER BY completed ASC,
  CASE 
    WHEN completed = '0' THEN   UNIX_TIMESTAMP(delivered)       # ASC-ending
    ELSE                      - UNIX_TIMESTAMP(delivered)       # DESC-ending
  END ASC
;

第一个排序字段是
completed
ASC
-当然结束了

对于第二个字段,您可以使用一个表达式,使
delivered
的值按需要排序。假设列
delivered
的类型为
DATE
DATETIME
UNIX\u TIMESTAMP(delivered)
是一个数字

对于
completed='0'
按升序使用
UNIX\u时间戳(已交付)
。对于
已完成的“0”
,使用反数值(
-UNIX\u TIMESTAMP(delivered)
)也已排序
ASC
,结束将颠倒行的顺序

以下是查询:

SELECT *
FROM users
ORDER BY completed ASC,
  CASE 
    WHEN completed = '0' THEN   UNIX_TIMESTAMP(delivered)       # ASC-ending
    ELSE                      - UNIX_TIMESTAMP(delivered)       # DESC-ending
  END ASC
;

这几乎奏效了!但是它没有显示完成的0的第一个?@CraigyCraigo只需添加
按完成的顺序,case…
这几乎有效!但它没有显示完成的0的第一个?CraigyCraigo只需添加
按完成顺序,case…
交付的类型是什么?列
交付的类型是什么?有趣的选择,但我认为上面的答案更容易理解和使用。的确,它更清晰,而且无论交付的列类型如何,它都能正常工作。我的答案不适用于字符串。这是一个有趣的选择,但我认为上面的答案更容易理解和使用。事实上,它更清晰,而且无论交付的列类型如何,它都有效。我的不适用于弦。