Existe uma maneira mais simples de encontrar MODO (S) de alguns valores no MySQL
MODO é o valor que ocorre nos horários MAIS nos dados, pode haver UM MODO ou MUITOS MODOS
aqui estão alguns valores em duas tabelas (sqlFiddle)
create table t100(id int auto_increment primary key, value int);
create table t200(id int auto_increment primary key, value int);
insert into t100(value) values (1),
(2),(2),(2),
(3),(3),
(4);
insert into t200(value) values (1),
(2),(2),(2),
(3),(3),
(4),(4),(4);
agora, para obter o MODO (S) retornado como lista separada por vírgula, eu corro a consulta abaixo para tabelat100
SELECT GROUP_CONCAT(value) as modes,occurs
FROM
(SELECT value,occurs FROM
(SELECT value,count(*) as occurs
FROM
T100
GROUP BY value)T1,
(SELECT max(occurs) as maxoccurs FROM
(SELECT value,count(*) as occurs
FROM
T100
GROUP BY value)T2
)T3
WHERE T1.occurs = T3.maxoccurs)T4
GROUP BY occurs;
e a consulta abaixo para tabelat200
(mesma consulta apenas com o nome da tabela alterado) Eu tenho 2 tabelas neste exemplo porque para mostrar que ele funciona para casos em que há 1 modo e onde existem vários modos.
SELECT GROUP_CONCAT(value) as modes,occurs
FROM
(SELECT value,occurs FROM
(SELECT value,count(*) as occurs
FROM
T200
GROUP BY value)T1,
(SELECT max(occurs) as maxoccurs FROM
(SELECT value,count(*) as occurs
FROM
T200
GROUP BY value)T2
)T3
WHERE T1.occurs = T3.maxoccurs)T4
GROUP BY occurs;
Minha pergunta é "Existe uma maneira mais simples?"
Eu estava pensando em usarHAVING count(*) = max(count(*))
ou algo semelhante para se livrar da junção extra, mas não conseguiuHAVING
para devolver o resultado que eu queria.
ATUALIZADO: como sugerido por @zneak, posso simplificarT3
como abaixo:
SELECT GROUP_CONCAT(value) as modes,occurs
FROM
(SELECT value,occurs FROM
(SELECT value,count(*) as occurs
FROM
T200
GROUP BY value)T1,
(SELECT count(*) as maxoccurs
FROM
T200
GROUP BY value
ORDER BY count(*) DESC
LIMIT 1
)T3
WHERE T1.occurs = T3.maxoccurs)T4
GROUP BY occurs;
Agora existe uma maneira de obter passeio de T3 no total? Eu tentei isso, mas não retorna nenhuma linha por algum motivo
SELECT value,occurs FROM
(SELECT value,count(*) as occurs
FROM t200
GROUP BY `value`)T1
HAVING occurs=max(occurs)
basicamente eu estou querendo saber se há uma maneira de fazer isso de tal forma que eu só preciso especificart100
out200
uma vez.
ATUALIZADO: encontrei uma maneira de especificart100
out200
apenas uma vez adicionando uma variável para definir meus próprios maxocurs como abaixo
SELECT GROUP_CONCAT(CASE WHEN occurs=@maxoccurs THEN value ELSE NULL END) as modes
FROM
(SELECT value,occurs,@maxoccurs:=GREATEST(@maxoccurs,occurs) as maxoccurs
FROM (SELECT value,count(*) as occurs
FROM t200
GROUP BY `value`)T1,(SELECT @maxoccurs:=0)mo
)T2