2013-05-20 3 views
0

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

У меня есть этот

Таблица имя = мощности имен столбцов = Power1, POWER2, ​​POWER2, ​​POWER4, POWER5

$res = mysql_query("select power1, power2, power2, power4, power5, 
count(*) as cnt 
from power 
group by power1, power2, power2, power4, power5 
order by cnt desc limit 5;"); 

, который показывает конкретную строку из таблицы, а не только наиболее распространенной 5 номера из таблицы

the table entries

the results

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

любые идеи были бы очень приняты.

Большое спасибо

Пол

+0

1. Нормализуйте свои данные. – Strawberry

ответ

5

Чтобы получить 5 наиболее распространенных значений в столбце col в таблице x:

select col, count(*) as cnt 
from x 
group by col 
order by cnt desc 
limit 5; 

Если вы пытаетесь получить пять наиболее общих номеров в пять столбцы (a основные вопрос к вопросу после моего первоначального ответа), вот один из способов:

select power, count(*) as cnt 
from (select (case when n = 1 then power1 
        when n = 2 then power2 
        when n = 3 then power3 
        when n = 4 then power4 
        when n = 5 then power5 
       end) as power 
     from power p cross join 
      (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5 
      ) n 
    ) p 

Это помещает все столбцы в один столбец, а затем возвращает наиболее распространенные значения.

+0

Благодарим вас за помощь, однако я не могу заставить ее работать –

+0

мой плохой, эхо было неверно. Большое спасибо –

+0

, предполагая, что группировка неверна. –

0

Чтобы получить лучшие 5 наиболее распространенных значений во всех столбцах, вы должны присоединиться к таблице 5 раз

Select top 5 val From 
(Select power1 val From table 
    Union Select power2 val From table 
    Union Select power3 val From table 
    Union Select power4 val From table 
    Union Select power5 val From table) z 
Group By val 
Order By Count(*) Desc 
+0

Как бы мне это повторить? –

0
Select Z.Num, Count(*) As Cnt 
From (
     Select power1 As Num From power 
     Union All Select power2 From power 
     Union All Select power3 From power 
     Union All Select power4 From power 
     Union All Select power5 From power 
     ) As Z 
Group By Z.Num 
Order By Count(*) Desc 
Limit 5 

Убедитесь, что вы используете Union All или иначе вы получите 1 в качестве счетчика для каждое дискретное число.

SQL Fiddle version

Смежные вопросы