MySQL 别名子查询

Posted

技术标签:

【中文标题】MySQL 别名子查询【英文标题】:MySQL aliasing subqueries 【发布时间】:2019-03-09 11:47:55 【问题描述】:

我有一个只包含两列的表:id1 和 id2。 mysql 中的以下查询可以正常工作:

(select id1 as id, count(id1) as cnt
from my_table 
group by id1)
union all
(select id2 as id, count(id2) as cnt
from my_table
group by id2)

如果我想将上面的查询用作子查询,我需要为每个派生表设置别名 - 下面的代码会出错(“每个派生表都必须有自己的别名”):

select id, cnt from
(select id1 as id, count(id1) as cnt
from my_table 
group by id1)
union all
(select id2 as id, count(id2) as cnt
from my_table
group by id2)

但是我找不到正确的语法来给派生表起别名。我正在尝试添加和删除括号,但到目前为止还没有运气。对于下面的查询,我只是得到一般的 SQL 语法错误:

select id, cnt from
(select id1 as id, count(id1) as cnt
from my_table 
group by id1) as tab1
union all
(select id2 as id, count(id2) as cnt
from my_table
group by id2) as tab2

稍后我会想用这个子查询做更多的事情,而不是只选择 id 和 cnt,但它是一个简化的场景,可以找到别名子查询的正确语法。

【问题讨论】:

我确定不是“它是”! 见meta.***.com/questions/333952/… 【参考方案1】:

试试下面:因为你合并了所有的结果,所以你只需要一个别名

SELECT id, cnt
FROM
(
    SELECT id1 AS id, COUNT(id1) AS cnt
    FROM my_table 
    GROUP BY id1
    UNION ALL
    SELECT id2, COUNT(id2)
    FROM my_table
    GROUP BY id2
) AS tab;

【讨论】:

【参考方案2】:

为了完善这个问题,以下是合并两个派生表所需的语法:

SELECT id, cnt
FROM
(
    SELECT id1 AS id, COUNT(id1) AS cnt
    FROM my_table 
    GROUP BY id1
) AS tab1
UNION ALL
SELECT id, cnt
FROM
(
    SELECT id2 AS id, COUNT(id2) AS cnt
    FROM my_table
    GROUP BY id2
) AS tab2;

Demo

您需要为UNION 中子查询的每个 组件显式选择语句。当然,@fa06 的答案是你应该使用的,但是如果你需要沿着这条路走,上面就是你如何让它工作的方法。

【讨论】:

感谢您的解释!

以上是关于MySQL 别名子查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 如何将子查询中的列别名用于另一个子查询?

连接查询与子查询

Mysql数据库理论基础之五--SELECT单多表查询子查询别名

mysql中多个left join子查询写法以及别名用法

MySQL学习笔记连接子分页联合查询以及sql语句执行顺序总结

SQL Server - 在子查询中使用列别名