很长一段时间我使用这种方法来命令我的列表(用于html选择):
SELECT '' AS ID, '' AS Name UNION
SELECT ID, Name FROM (SELECT ID, Name FROM myTable ORDER BY Name) AS myTableTmp
但在更新到我发现的新MySQL(MariaDB)版本后,此排序不再有效。就像这里解释的那样,它与SQL标准冲突:https://www.somesite.com
获得所需订单的最佳做法是什么?
或者我应该使用简单的方法,并将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版本中获得相同的结果?
答案 0 :(得分:0)
否则您可以通过外部移动订单:
SELECT
ID, Name
FROM
(SELECT '' AS ID, '' AS Name UNION SELECT
ID, Name
FROM
yourTable) AS yourTableTmp
ORDER BY Name;
答案 1 :(得分:0)
您可以使用ORDER BY CASE ... END
更改defualt排序行为以获得预期结果。
工作原理
所有' - '价值得到了位置" 1"在ORDER BY中
所有NULL值都得到位置" 2"在ORDER BY中
所有名字都得到位置" 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
但如果有人说出姓名&#39; - &#39;在表?我可能会错误的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
答案 2 :(得分:0)
我想,momet上最干净的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