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

时间:2016-10-27 08:22:26

标签: mysql

拥有像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" 

5 个答案:

答案 0 :(得分:2)

这个怎么样:

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

您可以尝试先交换哪个列。

答案 1 :(得分:0)

假设parent_idorder_nr是varchar列,但您想将它们排序为数字,那么您可以在订购时转换列:

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

注意:您的第一个所需输出似乎没有任何明显的逻辑,所以我为第二个提供了解决方案。

答案 2 :(得分:0)

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" 

答案 3 :(得分:0)

假设id的两位数字(但可以扩展到任意位数)

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

或者如果ids是字符串

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

答案 4 :(得分:0)

parent_id为0时,只需使用id,否则请使用parent_id;按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;