【问题标题】:MySQL aliasing subqueriesMySQL 别名子查询
【发布时间】: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,但它是一个简化的场景,可以找到别名子查询的正确语法。

【问题讨论】:

标签: mysql sql aliases


【解决方案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 的答案是你应该使用的,但是如果你需要沿着这条路走,上面就是你如何让它工作的方法。

    【讨论】:

    • 感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多