MySQL - ORDER BY 与 UNION 的一部分
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 - 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旧版本:
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
But what if someone put name '-' in table? i may get the wrong id in
that case...
查询
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
我想,最干净的 SQL 目前唯一的解决方案如下
Using union and order by clause in 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
长期以来我一直使用这种方法来排序我的列表(对于 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 - 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旧版本:
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
But what if someone put name '-' in table? i may get the wrong id in that case...
查询
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
我想,最干净的 SQL 目前唯一的解决方案如下 Using union and order by clause in 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