首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UNION创建人工行的顺序

问使用UNION创建人工行的顺序
EN

Stack Overflow用户
提问于 2016-05-12 07:56:45
回答 2查看 62关注 0票数 0

我用一个联盟为“所有国家”制造了一场人为的争吵:

代码语言:javascript
复制
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添加了人工行时,如何按列排序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-12 08:03:56

一个选项是在每个子选择中添加第四列,该列对UNION的每个部分的出现顺序进行排序。在您的示例中,您希望UNION的第一部分以表标题的形式出现在顶部。然后,在外部查询中,只选择真正希望显示在报表中的三列。

代码语言:javascript
复制
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值的自然排序,那么您就不需要一个子查询。

票数 1
EN

Stack Overflow用户

发布于 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的类型是数字类型,则只需在生成的行中使用数字:

代码语言:javascript
复制
SELECT '0', 'all countries', 10000000000000 AS users
# ... the rest of the query here

如果列users.country_internet_users的类型是字符串类型,则必须选择:

  1. 在查询中将值转换为整数;这使得查询运行得非常慢;
  2. 将列的类型更改为数字类型(首先应该这样创建它): 修改表国家,修改country_internet_users,INT,无符号,不为空;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37180697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档