【发布时间】:2018-06-15 12:00:10
【问题描述】:
长期以来,我一直使用这种方法来订购我的列表(用于 html 选择):
SELECT '' AS ID, '' AS Name UNION
SELECT ID, Name FROM (SELECT ID, Name FROM myTable ORDER BY Name) AS myTableTmp
但在更新到新的 MySQL(MariaDB) 版本后,我发现这种排序不再起作用。就像这里解释的那样,它与 SQL 标准冲突:mysql - order by inside subquery
获得所需订单的最佳做法是什么?
或者我应该使用简单的方法,并将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 版本中获得相同的结果?
【问题讨论】:
-
外部查询中的 order by 将是最简单的。
-
但无论如何我都希望工会的第一部分保持领先。
SELECT '' AS ID, '' AS Name UNION SELECT ID, Name FROM myTable ORDER BY Name会为所有行排序,甚至给出错误吗?我记得至少在大约 8 年前就存在这个问题...... -
ORDER BY 最后是下订单 (3, 0, 2, 1),我需要订单 (0, 3, 2, 1) ...
标签: mysql sql-order-by mariadb union