MySQL: считать, группировать и сортировать по: всей таблице данных? - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть таблица с данными:

id   one    two    three   four     five    six
------------------------------------------------
1    12     32     2       5        34       13
2    43     12     3       33       22       17
3    11     31     3       15       13       13
4    43     12     52      73       29       19
5    3      2      2       3        9        9
6    4      1      3       7        2        19
-------------------------------------------------

Так что я знаю, как считать, группировать и упорядочивать по одному столбцу, например так: select one, count(one) from table_numbers group by one order by count(one) desc Вышеупомянутый запрос даст нам:

one     count(one) 
-----------------
43      2
3       1
4       1
11      1
12      1
-----------------

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

Как это:

One  Count(one) Two Count(two)  Three   Count(three)    Four    Count(four)
--------------------------------------------------------------------------- 
43   2          12  2           3       3               73       1           
3    1          1   1           2       2               3        1           
4    1          2   1           52      1               5        1           
11   1          31  1           null    null            7        1          
12   1          32  1           null    null            15       1          
null null      null null        null    null            33       1          
---------------------------------------------------------------------------

Теперь есть ли способ сделать это в одном запросе SQL?Может быть, использовать соединения или встроенные представления или что-то еще?Или это возможно в одном запросе?

[обновление] Я хочу подсчитать повторяющиеся значения из каждого столбца и отсортировать их в порядке убывания.

[ОБНОВЛЕНИЕ] В случае, если вы хотитеиспользуйте данные таблицы:

CREATE TABLE IF NOT EXISTS `table_numbers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,  `one` int(2) NOT NULL,
  `two` int(2) NOT NULL,  `three` int(2) NOT NULL,
  `four` int(2) NOT NULL,  `five` int(2) NOT NULL,
  `six` int(2) NOT NULL,  PRIMARY KEY (`id`),
  KEY `col_one` (`one`),  KEY `col_two` (`two`),
  KEY `col_three` (`three`),  KEY `col_four` (`four`),
  KEY `col_five` (`five`),  KEY `col_six` (`six`)
) ;

INSERT INTO `table_numbers` (`id`, `one`, `two`, `three`, `four`, `five`, `six`)
VALUES
(1, 12, 32, 2, 5, 34, 13),(2, 43, 12, 3, 33, 22, 17),(3, 11, 31, 3, 15, 13, 13),
(4, 43, 12, 52, 73, 29, 19),(5, 3, 2, 2, 3, 9, 9),(6, 4, 1, 3, 7, 2, 19);

Пакет благодарностей заранее!

Jay: -)

Ответы [ 5 ]

1 голос
/ 22 ноября 2011

Простой способ получить количество столбцов в одном запросе:

(select 'one' as col, one as item, count(one) as count from table_numbers group by one) UNION
(select 'two', two, count(two) from table_numbers group by two) UNION
(select 'three', three, count(three) from table_numbers group by three) UNION
(select 'four', four, count(four) from table_numbers group by four) UNION
(select 'five', five, count(five) from table_numbers group by five) UNION
(select 'six', six, count(six) from table_numbers group by six) UNION
ORDER BY col, count DESC

Это гораздо сложнее, если вы хотите, чтобы сводка в столбцах (пример для 3 столбцов):

SELECT tone.item as One, tone.count as `Count(one)`, ttwo.item as Two, ttwo.count as `Count(two)`, tthree.item as Three, tthree.count as `Count(three)` 
FROM 
  (SELECT @rownumtmp:=@rownumtmp+1 as rownum 
   FROM 
    (SELECT DISTINCT col, count 
     FROM (
      (select 'one' as col, one as item, count(one) as count from table_numbers group by one) UNION
      (select 'two', two, count(two) from table_numbers group by two) UNION
      (select 'three', three, count(three) from table_numbers group by three)) tmp) tmp2, 
    (SELECT @rownumtmp:=0) r) tmp2 LEFT OUTER JOIN 
  (SELECT @rownum1:=@rownum1+1 as rownum, item, count FROM (SELECT one as item, count(one) as count from  table_numbers group by one ORDER BY count DESC, one) d, (SELECT @rownum1:=0) r)  tone ON tmp2.rownum=tone.rownum LEFT OUTER JOIN
  (SELECT @rownum2:=@rownum2+1 as rownum, item, count FROM (SELECT two as item, count(two) as count from  table_numbers group by two ORDER BY count DESC, two) d, (SELECT @rownum2:=0) r)  ttwo ON tmp2.rownum=ttwo.rownum LEFT OUTER JOIN
  (SELECT @rownum3:=@rownum3+1 as rownum, item, count FROM (SELECT three as item, count(three) as count from  table_numbers group by three ORDER BY count DESC, three) d, (SELECT @rownum3:=0) r)  tthree ON tmp2.rownum=tthree.rownum 
WHERE tone.item IS NOT NULL OR ttwo.item IS NOT NULL OR tthree.item IS NOT NULL

Результат вышеприведенного запроса будет выглядеть так:

One  Count(one) Two Count(two)  Three   Count(three)
-----------------------------------------------------   
43   2          12  2           3       3            
3    1          1   1           2       2       
4    1          2   1           52      1        
11   1          31  1           null    null            
12   1          32  1           null    null                
------------------------------------------------------
0 голосов
/ 22 июня 2014

Единственный способ, которым я вижу, что это можно сделать, это ... экспортировать данные из таблицы в виде одной длинной строки целого числа то есть плоский файл и импортировать данные обратно в новую таблицу как одно поле. Напишите SQL-оператор, чтобы экстраполировать дубликат на новое поле и сделать общий подсчет. Делайте то же самое, пока импортированные данные в поле не станут пустыми. Надеюсь, что поможет.

0 голосов
/ 22 ноября 2011

Я сомневаюсь в возможности сделать это в одном запросе! Запрос пересекает таблицу только один раз при выполнении .. в вашем случае его нужно посчитать более одного столбца.

0 голосов
/ 22 ноября 2011

Вы имели в виду это?

SELECT
    one AS val, COUNT(*) AS c
FROM ( 
    SELECT one FROM table_numbers UNION ALL
    SELECT two FROM table_numbers UNION ALL
    SELECT three FROM table_numbers UNION ALL
    SELECT four FROM table_numbers UNION ALL
    SELECT five FROM table_numbers UNION ALL
    SELECT six FROM table_numbers 
) x GROUP BY one ORDER BY c DESC;
0 голосов
/ 22 ноября 2011

Ты имеешь в виду это?:

select one, two, three, four, five, six, count(1) 
from table_numbers group by one, two, three, four, five, six
order by count(1) desc

Вы пытаетесь найти дубликаты?

...