Tengo una tabla simple de 7 columnas.

Week ¦ 1st ¦ 2nd ¦ 3rd ¦ 4th ¦ 5th ¦ 6th ¦

Cada semana, mi padre agrega los números de lotería de Saturday Saturday UK a un simple script PHP que creé. Ha comenzado temprano con Alzheimer y trata de mantener su cerebro activo. Esta noche me hizo una pregunta sobre la base de datos. Me preguntó si era posible ver los 6 números más populares.

Intenté crear una consulta SQL simple:

SELECT 1st, 2nd, 3rd, 4th, 5th, 6th, COUNT(*) AS 'foo' FROM `dad` GROUP BY 1st, 2nd, 3rd, 4th, 5th, 6th ORDER BY foo DESC

Pero los resultados no fueron como esperaba.

1st 2nd 3rd 4th 5th 6th foo
2   6   8   32  33  35  1
3   6   12  17  35  40  1
3   6   31  43  46  53  1
etc

Lo que esperaba que sucediera sería que la tabla se fusionara en una columna, y luego contara y tuviera un resultado simple, algo como:

Number   Count
2        1
3        2
6        3
8        1

Y luego tal vez ponerlo en orden ascendente. Entonces puedo usar esa consulta SQL para crear una tabla simple para que él muestre los números más comunes.

Estoy pensando en hacer una consulta SQL general

SELECT 1st FROM `dad`

Luego crea una matriz con los resultados, luego agrega

SELECT 2nd FROM `dad`

Al final de la matriz y continuando para las 6 columnas, luego usando PHP para contar los números individualmente.

¿Hay una manera más rápida?

1
Tony Savage 25 jun. 2020 a las 01:48

2 respuestas

La mejor respuesta

Usted puede hacer:

select
  n, cnt
from (
  select
    n,
    count(*) as cnt
  from (
    select `1st` as n from `dad` union all
    select `2nd` from `dad` union all
    select `3rd` from `dad` union all  
    select `4th` from `dad` union all
    select `5th` from `dad` union all
    select `6th` from `dad`
  ) x
  group by n
) y
order by cnt desc
limit 6
0
The Impaler 24 jun. 2020 a las 22:54

Su primer esfuerzo debe ir en arreglar su modelo de datos. Cada número debe almacenarse en una fila separada en lugar de en una columna, como:

week    pos    num
   1      1      6
   1      2      8
   1      3     32

Entonces su consulta sería una consulta agregada simple:

select num, count(*) no_picks from dad group by num order by no_picks desc

Para su estructura de tabla dada, necesitaría desenredar las columnas a filas. En MySQL, puede usar union all para esto:

select num, count(*) no_picks
from (
    select `1st` num from dad
    union all select `2nd` from dad
    union all select `3rd` from dad
    union all select `4th` from dad
    union all select `5th` from dad
    union all select `6th` from dad
) t
group by num 
order by no_picks
3
GMB 24 jun. 2020 a las 22:51