2013-09-18 2 views
0

Как получить количество чисел в строке.Как получить итоговый счет (ы) в MYSQL

Пример

mydtabase

num1 num2 num3 num4 
10 20 30 40 
40 50 60 70 
20 10 90 80 
01 60 81 99 

поэтому я хочу, чтобы результаты были для всей таблицы:

01 1 
10 2 
20 2 
30 1 

и так далее, что если я хочу резюме для только первый 2 линии я бы получил:

10 1 
20 1 
30 1 
40 2 
50 1 
60 1 
70 1 
+1

Не зная своих * реальных * данных, я думаю, вы можете посмотреть на проблему с дизайном. Имея таблицу с двумя столбцами, где первые «num1», «num2», «num3» и т. Д., А второе - это значение, позволит вам «GROUP_BY» в первом столбце и «COUNT()» на них , –

+0

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

+0

Попробуйте это ** скрипка http://sqlfiddle.com/#!2/71786/2** –

ответ

2

Чтобы получить результат для всей таблицы можно использовать запрос как это:

SELECT num, COUNT(*) cnt 
FROM (
    SELECT num1 AS num FROM tableName 
    UNION ALL 
    SELECT num2 AS num FROM tableName 
    UNION ALL 
    SELECT num3 AS num FROM tableName 
    UNION ALL 
    SELECT num4 AS num FROM tableName 
) s 
GROUP BY num 

Чтобы получить результаты только для первых двух строк, можно использовать LIMIT:

SELECT num, COUNT(*) cnt 
FROM (
    SELECT id, num1 AS num FROM tableName 
    UNION ALL 
    SELECT id, num2 AS num FROM tableName 
    UNION ALL 
    SELECT id, num3 AS num FROM tableName 
    UNION ALL 
    SELECT id, num4 AS num FROM tableName 
    ORDER BY id 
    LIMIT 8 
) s 
GROUP BY num 

где 8 - это 4 столбца * количество строк, которое вы хотите 2, но вам нужно использовать предложение ORDER BY. Пример: here.

+0

Nope limit 8 не будет определять, что из каждого запроса потребуется 2 строки, вы можете увидеть свою собственную скрипку, в которой отсутствует ваш второй запрос. Нет, 30, 70 –

+0

См. разницу использования предела в каждом запросе при использовании union ** http: //sqlfiddle.com/#! 2/71786/2 ** –

+0

@dianuj LIMIT 8 верен, но вам нужно использовать ORDER BY (я указал, что в моем ответьте, но я забыл добавить его в запрос ...), я обновлю свой ответ ... но вам нужно использовать заказ, даже если вы используете несколько ограничений 2 – fthiella

0

Если это нужно сделать с PHP (который, как я полагаю,), поместите каждый элемент в массив.

так, например, ваш $array would be array(10,20,30,40,40,50,60,70) для первых 2-х линий. А затем использовать print_r(array_count_values($array));

array-count-values

1

Ответ на ваш вопрос, что вы UNPIVOT таблицу, а затем агрегировать:

select (case when n.n = 1 then num1 
       when n.n = 2 then num2 
       when n.n = 3 then num3 
       when n.n = 4 then num4 
      end) as num, count(*) 
    from t cross join 
     (select 1 as n union all select 2 union all select 3 union all select 4) n 
    group by (case when n.n = 1 then num1 
       when n.n = 2 then num2 
       when n.n = 3 then num3 
       when n.n = 4 then num4 
      end); 
Смежные вопросы