繁体   English   中英

mysql需要获取结果的自定义顺序

[英]mysql need to get custom order of result

有像idparent_idorder_nr这样的MySQL表

现在选择这样的一切

SELECT * FROM `table1` WHERE 1 ORDER BY `id` DESC

并得到像

`id`, `parent_id`, `order_nr`
"27",   "23",       "3" 
"26",   "23",       "2" 
"25",   "23",       "1" 
"24",   "0",        "0" 
"23",   "0",        "0" 
"22",   "0",        "0" 

只需按以下顺序获得相同的结果:

`id`, `parent_id`, `order_nr`
"24",   "0",        "0" 
"23",   "0",        "0" 
"25",   "23",       "3" 
"26",   "23",       "2" 
"27",   "23",       "1"
"22",   "0",        "0" 

这个怎么样:

SELECT * FROM `table1` WHERE 1 ORDER BY order_nr,parent_id,id DESC

您可以尝试交换应该先订购的列。

假设parent_idorder_nr是varchar列,但是您想将它们按数字排序,那么可以在订购时order_nr这些列:

SELECT *
FROM table1
ORDER BY CAST(parent_id AS SIGNED),   -- no need for CAST if already numeric
         CAST(order_nr AS SIGNED)

注意:您期望的第一个输出似乎没有任何明显的逻辑,因此我为第二个给出了解决方案。

SELECT * FROM `table1` WHERE 1 ORDER BY `parent_id`, `order_nr` ASC

输出如下:

`id`, `parent_id`, `order_nr`
"24",   "0",        "0" 
"23",   "0",        "0" 
"22",   "0",        "0" 
"25",   "22",       "1" 
"26",   "22",       "2" 
"27",   "22",       "3" 

假设ID为两位数(但可以扩展为任意位数)

SELECT IF(parent_id=0,id,parent_id)*100+IF(parent_id=0,0,id)),* FROM table ORDER BY 1 DESC

或者id是字符串

SELECT CONCAT(IF(parent_id='0',LPAD(id,2,'0'),LPAD(parent_id,2,'0')),IF(parent_id='0','00',LPAD(id,2,'0'))),* FROM table ORDER BY 1 DESC

这将为您提供第一列,即

2400 2300 2227 2226 2225 2200

parent_id为0时,只需使用id否则使用parent_id 然后按order_nr排序打破order_nr 所有排序都是降序排列:

SELECT id, parent_id, order_nr,
       id AS sort_order
  FROM table1
 WHERE parent_id = '0'
UNION
SELECT id, parent_id, order_nr,
       parent_id AS sort_order
  FROM table1
 WHERE parent_id <> '0'
 ORDER
    BY sort_order DESC, order_nr DESC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM