tengo una tabla simple de 7 columnas
Week ¦ 1st ¦ 2nd ¦ 3rd ¦ 4th ¦ 5th ¦ 6th ¦Cada semana, mi padre agrega los números de la lotería del Reino Unido de los sábados a un simple script PHP que creé. Tiene Alzheimer de inicio temprano 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.
Traté de 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 DESCPero los resultados no fueron los que 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 etcLo que esperaba que sucediera sería que la tabla se fusionara en una sola columna, y luego contara y obtuviera un resultado simple, algo así como:
Number Count 2 1 3 2 6 3 8 1Y luego tal vez ponerlo en orden ascendente. Luego puedo usar esa consulta SQL para crear una tabla simple para que muestre los números más comunes.
Estoy pensando en hacer una consulta SQL general
SELECT 1st FROM `dad`Luego creando una matriz con los resultados, luego agregando
SELECT 2nd FROM `dad`Hasta el final de la matriz y continuando por las 6 columnas, luego usando PHP para contar los números individualmente.
¿Hay una manera más rápida?
Su primer esfuerzo debe ser 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 32Entonces su consulta sería una consulta agregada simple:
select num, count(*) no_picks from dad group by num order by no_picks desc Para la estructura de su tabla dada, necesitaría cambiar las columnas a filas. En MySQL, puedes 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_picksTu puedes 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