2014-10-20 2 views
1

Я хочу показать таблицу вывода, которая учитывает всех пользователей, найденных в таблице. В основном я хочу выход выглядеть следующим образом: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 | 
+-----------+ 

ответ

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 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, свободной от такого недостатка.

+0

Это на самом деле дал мне ответ, который я искал. Не могли бы вы добавить небольшое описание того, как это работает? Я хочу понять, почему это происходит, поскольку я новичок. – clueless

+0

Кроме того, я не мог получить 'count (u1. *)' Для работы (синтаксическая ошибка), мне пришлось пойти с 'count (u1.name)'. – clueless

+0

@DumbAsker Действительно выглядит, как count (u1. *) Не работает. Я уточнил запрос и добавлю другой, используя тот же подход. – triclosan

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') 
0

кажется ваш запрос неправильно ..

союз не будет объединять результаты двух запросов так, как вы описали выше.

Объединение объединяет результат двух или более операторов выбора, но не будет «присоединяться» к нему.

Возможно, вы захотите использовать соединения для этой причины. до сих пор вы не смогли бы поставить 5 | 2 в той же строке, что она в основном предполагает -> выборки пользователя 1 и пользователя 2 значения для одного конкретного типа

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