2015-02-18 6 views
0

Я попытался увидеть похожие вопросы, но никто не помогает в решении этого эффективного способа.Получайте количество каждого значения из каждого столбца одновременно

Дело в том, у меня есть таблица со столбцами, как это:

table with 3 columns

Я хочу, чтобы подсчитать число вхождений значения в каждом столбце, но и для всех столбцов таблицы, а не только один.

Я хочу, чтобы получить что-то вроде этого:

p7  | p7_count | p9 | p9_count 
B  | 1  | A | 2 
A  | 1  | E | 1 
C  | 1  

Но я только в состоянии получить это с помощью одного запроса для каждого из них, как:

SELECT p9, count(*) AS p9_Count 
FROM respostas 
GROUP by p9 
ORDER BY p9_Count DESC 

Но результат я получаю :

p9 column occurrences count p9 column occurrences count

Есть ли способ сделать это для всех столбцов вместо того, чтобы делать это для каждого отдельно и получить результат отдельно?

+0

Когда вы говорите * «Я хочу получить что-то подобное» *, вы представляете два отдельных результата запроса. Если вы хотите иметь его в одном запросе, что бы вы хотели, чтобы он выглядел? – GolezTrol

+0

Как насчет вывода типа 'col_name, col_value, count'? – Bohemian

+0

Мне хотелось бы получить 2 отдельных запроса в одной таблице. Я немного отредактировал этот вопрос. Надеюсь, теперь все ясно. –

ответ

1

Я думаю, что это то, что вы изобразили. Это становится грязным, но вы можете расширить его, добавив к коалесцентам. Чтобы заставить его работать с функцией row_number (для MySQL), я преобразовал его, чтобы вместо этого использовать подзапрос. Это не будет даже отдаленно эффективным, когда количество строк станет большим, потому что SQL не является подходящим инструментом для этой работы.

select 
    p1, p1_count, p2, p2_count, p3, p3_count 
from 
(
    select 
     p1, p1_count, 
     (
      select count(*) from 
       (SELECT p1, count(*) AS p1_Count FROM respostas GROUP by p1) as t2 
      where 
        t2.p1_Count <= t1.p1_Count 
       or (t2.p1_Count = t1.p1_Count and t2.p1 <= t1.p1) 
     ) as rownum 
    from (SELECT p1, count(*) AS p1_Count FROM respostas GROUP by p1) as t1 
) as tt1 

    full outer join 

(
    select 
     p2, p2_count, 
     (
      select count(*) from 
       (SELECT p2, count(*) AS p2_Count FROM respostas GROUP by p2) as t2 
      where 
        t2.p2_Count <= t1.p2_Count 
       or (t2.p2_Count = t1.p2_Count and t2.p2 <= t1.p2) 
     ) as rownum 
    from (SELECT p2, count(*) AS p2_Count FROM respostas GROUP by p2) as t2 
) as tt2 
    on tt2.rownum = tt1.rownum 

    full outer join 

(
    select 
     p3, p3_count, 
     (
      select count(*) from 
       (SELECT p3, count(*) AS p3_Count FROM respostas GROUP by p3) as t2 
      where 
        t2.p3_Count <= t1.p3_Count 
       or (t2.p3_Count = t1.p3_Count and t2.p3 <= t1.p3) 
     ) rownum 
    from (SELECT p3, count(*) AS p3_Count FROM respostas GROUP by p2) as t3 
) as tt3 
    on tt3.rownum = coalesce(tt1.rownum, tt2.rownum) 

order by 
    coalesce(tt1.rownum, tt2.rownum, tt3.rownum) 
+0

Я пробовал работать с этим на phpmyadmin, и мне кажется, что ему не нравится row_number(), поскольку он говорит, что рядом с этим кодом есть синтаксическая ошибка. –

+0

Я думаю, я не видел тег mysql. – shawnt00

+0

@Rasec Я сделал некоторые изменения, которые могут сработать. Я признаюсь, что я его еще не протестировал. – shawnt00

1

Вы бы сделали это с помощью union all. Это немного непонятно, что вы хотите. Возможно, это близко:

select p, max(p7cnt) as p7cnt, max(p8cnt) as p8cnt, max(p9cnt) as p9cnt 
from ((select p7 as p, count(*) as p7cnt, 0 as p8cnt, 0 as p9cnt 
     from respostas 
     group by p7 
    ) union all 
     (select p8, 0 as p7cnt, count(*) as p8cnt, 0 as p9cnt 
     from respostas 
     group by p8 
    ) union all 
     (select p9, 0 as p7cnt, 0 as p8cnt, count(*) as p9cnt 
     from respostas 
     group by p9 
    ) 
    ) ppp 
group by p; 
+0

Мне понравилась эта идея, но она не считается так, как я ожидал бы этого. Он показывает только 1 из числа для каждого значения столбца. –