繁体   English   中英

MySQL-与UNION一起使用的ORDER BY

[英]MySQL - ORDER BY with part of UNION

长期以来,我一直使用这种方法来排序我的列表(对于html selects):

SELECT '' AS ID, '' AS Name UNION 
SELECT ID, Name FROM (SELECT ID, Name FROM myTable ORDER BY Name) AS myTableTmp

但是我发现更新到新的MySQL(MariaDB)版本后,这种排序不再起作用。 就像这里解释的那样,它与SQL标准冲突:mysql- 在内部子查询中排序

什么是获得所需订单的最佳实践? 还是我应该使用简单的方法,并将LIMIT 65000添加到嵌套查询中?

编辑:

好吧,我最初的示例不够精确,因此人们误解了我。 这是更正的示例:

CREATE TABLE IF NOT EXISTS `myTable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(120) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;


INSERT INTO `myTable` (`ID`, `Name`) VALUES
(1, 'Banana'),
(2, 'Apple'),
(3, NULL);

如果我选择旧版本:

SELECT '0' AS ID, '-' AS Name UNION 
SELECT ID, Name FROM (SELECT ID, Name FROM myTable ORDER BY Name) AS myTableTmp

我得到:

0   -
3   NULL
2   Apple
1   Banana

我如何在新的MySQL版本中获得相同的结果?

否则,您可以在外面移动订单:

SELECT 
    ID, Name
FROM
    (SELECT '' AS ID, '' AS Name UNION SELECT 
        ID, Name
    FROM
        yourTable) AS yourTableTmp
ORDER BY Name;

您可以使用ORDER BY CASE ... END更改默认排序行为以获得预期结果。

这个怎么运作

所有“-”值在ORDER BY中的位置为“ 1”
所有NULL值都在ORDER BY中获得位置“ 2”
所有名称的位置均为“ 3+”,并按字母排序。

询问

SELECT '0' AS ID, '-' AS Name UNION 
SELECT ID, Name FROM (
  SELECT
     ID
   , Name
  FROM
   myTable
) AS myTableTmp
ORDER BY
 CASE 
  WHEN 
   Name = '-'
  THEN
   1
  WHEN 
   Name IS NULL
  THEN
   2
  ELSE 
   Name
 END

参见演示https://www.db-fiddle.com/f/xcy45sUEDKN9gJhNpVqoHd/2

但是,如果有人在表中放置名称“-”怎么办? 在这种情况下,我可能会得到错误的ID ...

询问

SELECT
   '0' AS ID
 , '-' AS Name
 , 0 AS position

UNION

SELECT
   ID
 , Name
 , CASE
     WHEN 
      Name IS NULL
     THEN 
      2
     ELSE
      3
   END AS position
FROM (
   SELECT
       ID
     , Name
   FROM
    myTable 
) AS myTableTmp

ORDER BY 
   position
 , name ASC

参见演示https://www.db-fiddle.com/f/xcy45sUEDKN9gJhNpVqoHd/7

我想,最干净的SQL只在momet的解决方案是在这里通过在MySQL子句通过工会和秩序

SELECT ID, Name FROM (
SELECT '0' AS ID, '-' AS Name, 1 AS Rank UNION 
SELECT ID, Name, 2 AS Rank FROM myTable
) AS myTableTmp ORDER BY Rank, Name

暂无
暂无

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

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