我用一个联盟为“所有国家”制造了一场人为的争吵:
SELECT '0', 'all countries', '10000000000000' AS users
UNION
SELECT country_id, country_name, country_internet_users AS users
FROM countries
ORDER BY users DESC
LIMIT 10当我尝试按country_internet_users进行排序时,问题就来了。
MySQL的行为似乎不像预期的那样。它一点也不排序。在我添加“作为用户”之前,它甚至不会运行该查询。但尽管如此,它似乎完全无视命令。
--当我使用UNION添加了人工行时,如何按列排序?
发布于 2016-05-12 08:03:56
一个选项是在每个子选择中添加第四列,该列对UNION的每个部分的出现顺序进行排序。在您的示例中,您希望UNION的第一部分以表标题的形式出现在顶部。然后,在外部查询中,只选择真正希望显示在报表中的三列。
SELECT t.country_id, t.country_name, t.users
FROM
(
SELECT '0' AS country_id, 'all countries' AS country_name, 10000000000000 AS users, 1 AS val
UNION ALL
SELECT country_id, country_name, country_internet_users AS users, 0 AS val
FROM countries
) AS t
ORDER BY t.val DESC, t.users DESC这种方法是保证UNION的前半部分出现在顶部的一种方法(假设这是您想要的)。正如@KubaWyrostek所指出的,如果您可以依赖于ID值的自然排序,那么您就不需要一个子查询。
发布于 2016-05-12 08:31:34
MySQL的行为似乎不像预期的那样。它一点也不排序。在我添加“作为用户”之前,它甚至不会运行该查询。
单独运行第一个查询,您将看到,由于没有对表达式进行别名,MySQL使用这些值作为其在结果集中生成的列的名称。就是这样,第一个查询生成名为0、all countries和10000000000000的列。当然,MySQL不能按列users对行进行排序,因为结果集中没有users列。
将第三个表达式化名为users之后,第一个查询返回列0、all countries和users,现在MySQL知道要使用哪个列进行排序。
但尽管如此,它似乎完全忽略了
ORDER BY。
不,它不会忽视ORDER BY。我不能确定,但我认为,因为您为列users生成的值是字符串,所以ORDER BY对列users的值使用字符串比较,甚至从表中提取的值也是整数(或者它们也是字符串)。
如果列users.country_internet_users的类型是数字类型,则只需在生成的行中使用数字:
SELECT '0', 'all countries', 10000000000000 AS users
# ... the rest of the query here如果列users.country_internet_users的类型是字符串类型,则必须选择:
https://stackoverflow.com/questions/37180697
复制相似问题