【问题标题】:How to order by the column which has the same column name in two tables after union two tables?合并两个表后如何按两个表中具有相同列名的列排序?
【发布时间】:2020-05-19 12:58:29
【问题描述】:

这是两张表:

Create table If Not Exists Customers (Id int, Name varchar(255));
Create table If Not Exists Orders (Id int, CustomerId int);
insert into Customers (Id, Name) values ('1', 'Joe');
insert into Customers (Id, Name) values ('2', 'Henry');
insert into Customers (Id, Name) values ('3', 'Sam');
insert into Customers (Id, Name) values ('4', 'Max');
insert into Orders (Id, CustomerId) values ('1', '3');
insert into Orders (Id, CustomerId) values ('2', '1');
insert into Orders (Id, CustomerId) values ('3', '5');
insert into Orders (Id, CustomerId) values ('4', '6');

我将两个表的左连接和右连接联合起来:

select *
from customers as c
left join orders as o
on c.id = o.customerid

union

select *
from customers as c
right join orders as o
on c.id = o.customerid;

但我想按客户表的 id 订购结果集:

select
*
from
customers as c
left join
orders as o
on
c.id = o.customerid

union

select
*
from
customers as c
right join
orders as o
on
c.id = o.customerid
order by
c.id;

但是 MySQL 的响应是“错误代码:1250。来自 SELECT 之一的表 'c' 不能在全局 ORDER 子句中使用”。所以我把代码改成:

select
*
from
customers as c
left join
orders as o
on
c.id = o.customerid

union

select
*
from
customers as c
right join
orders as o
on
c.id = o.customerid
order by
id;

但 MySQL 的响应是“错误代码:1052。订单子句中的列 'id' 不明确”。

我很理解这两个回答但我也想知道联合后如何从客户那里按id订购?

【问题讨论】:

标签: mysql sql sql-order-by union


【解决方案1】:

是的,您需要通过将当前查询设置为子查询来进行全局排序,例如单独为 id 列设置别名:

select *
  from
  (
   select c.id as c_id, c.name, o.id as o_id, o.CustomerId
     from customers as c
     left join orders as o
       on c.id = o.customerid
    union    
   select c.id as c_id, c.name, o.id as o_id, o.CustomerId
     from customers as c
    right join orders as o
       on c.id = o.customerid    
  ) q
 order by q.c_id  

【讨论】:

  • 我认为这样做可能更简单:select name, customerid, c.id as c_id, o.id as o_id from customers as c left join orders as o on c.id = o.customerid union select name, customerid, c.id as c_id, o.id as o_id from customers as c right join orders as o on c.id = o.customerid order by c_id; 只需重命名具有相同名称的两列即可。
【解决方案2】:

也许你需要这个:

(
select c.id c_id, c.name, o.id o_id
from Customers as c
left join Orders as o on c.id = o.customerid
)
union
(
select o.customerid, c.name, o.id
from Customers as c
right join Orders as o on c.id = o.customerid
)
order by c_id;

fiddle

【讨论】:

  • 抱歉,这行不通。添加“()”与不添加“()”的作用相同。
  • @TingweiMa 看来我没有正确理解你的任务......现在看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2022-01-02
相关资源
最近更新 更多