Mysql显示不同where子句的不同列

时间:2014-10-20 16:34:26

标签: mysql

我想显示一个输出表,该表计算表中找到的所有用户。 基本上我希望输出看起来像:

+-----------+-----------+
| user1     | user2     |
+-----------+-----------+
|         5 |         2 |
+-----------+-----------+

我只是使用虚拟表来测试它。我的查询如下:

(
    select 
        name as user1 
    from 
        users 
    where 
        name = 'root'
) UNION (
    select 
        name as user2 
    from
        users 
    where 
        name = 'not_root'
)

只输出这样的内容:

+-----------+
| user1     |
+-----------+
|         5 |
|         2 |
+-----------+

4 个答案:

答案 0 :(得分:1)

试试这个

SELECT
    SUM(CASE WHEN Name = 'root' THEN 1 ELSE 0 END) user1,
    SUM(CASE WHEN Name = 'not_root' THEN 1 ELSE 0 END) user2
FROM Users

答案 1 :(得分:0)

您可以在case内使用count语句在单独的列中获取计数

select
    count(case when name = 'root' then 1 end) user1,
    count(case when name = 'not_root' then 1 end) user2
from users
where name in ('root','not_root')

答案 2 :(得分:0)

<强> EDITED

该方法的主要思想是将表视为子查询中的两个不同的虚拟表。我们可以制作嵌套的select语句,例如(select count(*) as c from users where name = 'root') u1 MySql将其视为名为u1的特定表,其中一行和一列名为c

select u1.c as root_cnt, u2.c as not_root_cnt
from (select count(*) as c from users where name = 'root') u1,
(select count(*) as c from users where name = 'not_root') u2

此外,如果你有只返回一行的select语句,你可以直接在字段列表中放置嵌套选择

select (select count(*) as c from users where name = 'root') as root_cnt, (select count(*) as c from users where name = 'not_root') as not_root_cnt

这种方法的明显缺点是它的额外子查询。基于使用case when构造的方法没有这种缺点。

答案 3 :(得分:0)

看来你的查询错了..

union不会按照您上面描述的方式组合两个查询的结果。

union会合并两个或多个select语句的结果,但不会“加入”它。

您可能希望为此原因使用联接。仍然你不能把5 | 2放在同一行,因为它基本上建议 - &gt;获取一个特定类型的用户1和用户2值