Problemón inexplicable con MySQL
Hola a todos
Tengo 2 consultas que debería arrojar el MISMO resultado, pero NO!
Son 10 tablas con la misma extructura, la razón por la que está divido en diez es para mantenerlas mas pequeñas y ágiles.
El criterio para repartir los datos es en base al último dígito del código que cada uno tiene, asi que siquiero buscar alguno en particular, no tengo que recorrer las 10 tablas, voy directo a la tabla que se que lo tiene.
Consulta que (creo) anda bien:
select count(*)as cant, idCarrierGw from (
select * from tabla1
union
select * from tabla2
union
...
select * from tabla8
union
select * from tabla9
)cant
WHERE DATE(fechaHora) = '2009-07-23'
Group by idOperador
Esta consulta da valores que no llegan al total, es decir, da de menos:
select sum(cant) as total,idOperador from (
select count(*) as cant,idOperador from tabla0 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
union
select count(*) as cant,idOperador from tabla1 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
union
...
select count(*) as cant,idOperador from tabla8 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
union
select count(*) as cant,idOperador from tabla9 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
)cant
group by idOperador
No entiendo como puede pasar esto!!!!
Gracias
Saludos
dhcmega
- Inicie sesión o regístrese para enviar comentarios
- 1506 lecturas


No creo que explique el problema, pero a primera vista veo que la tabla0 sólo está abajo.
Utilizas el mismo alias (cant) para la UNION y para la columna que suma?
Supongo que el hecho de agrupar por idOperador pero seleccionar la columna idCarrierGw en la primer consulta es un error al postear, ademas solo mensiones 9 tablas en la primer consulta y 10 en la segunda (tabla0 no está en la primera)
Intenta ser mas preciso al posetar, así será mas fácil ayudarte
Saludos.
Perdón
Si utilizo el mismo (cant)
Las tablas las renombre y los campós también. Las tablas van de 0 a 9 y el campo está bien escrito en la consulta verdadera, las puse asi, para simplificar, estas TAMBIÉN generan la misma falla.
Les agradezco mucho el tiempo dedicado para leer.
Consulta que (creo) anda bien:
select count(*) as cant, idOperador from (
select * from tabla0
union
select * from tabla1
union
...
select * from tabla8
union
select * from tabla9
)cant
WHERE DATE(fechaHora) = '2009-07-23'
Group by idOperador
Esta consulta da valores que no llegan al total, es decir, da de menos:
select sum(cant) as total,idOperador from (
select count(*) as cant,idOperador from tabla0 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
union
select count(*) as cant,idOperador from tabla1 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
union
...
select count(*) as cant,idOperador from tabla8 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
union
select count(*) as cant,idOperador from tabla9 WHERE DATE(fechaHora) = '2009-07-23'
group by idOperador
)cant
group by idOperador
Gracias
Saludos
dhcmega
A ver si te entiendo, ¿asumes que la primera consulta si te da los resultados correctos o estas seguro que son correctos? te aconsejo que antes de hacer comparaciones de este tipo hagas consultas por separado y luego sumes los datos que te generan cada consulta y así estarás completamente seguro de cual deberia ser el resultado, tampoco entiendo para que haer dos consultas diferentes para generar el mismo resultado pero supongo que estas haciendo pruebas antes de elegir la consulta adecuada.
El comentario que te hacen sobre usar el mismo alias es acertado ya que puedes estar confundiendo al motor de MySQL al momento de realizar la suma por lo que te sugiero que cambies el alias de la sub-consulta, te sorprenderías de las cosas inexplicables que a veces ocurren con este gestor de bases de datos.
Por último te puedo decir que tener 10 tablas que contienen el mismo tipo de datos es mas dañido que tener una sola tabla a la larga, ten presente que estas tablas generan indices internos y estos al final cuentan para hacer más pesada la base de datos, pero deberias hacer un análisis más profundo de la data que almacenas y de ser necesario normalizar.
Saludos y espero ta ayude el comentario...
Hola, gracias por tu respuesta.
Voy a enumerar los puntos, para tratar de poner orden
1) Si, estoy haciendo 2 consultas, que deberían dar lo mismo, porque los números no cerraban, empecé a revisar y terminé haciendo otra consulta, que debería dar el mismo resultado, pero no.
2) La corrí varias veces y la diferencia va variando, no es siempre la misma, puede de ser 8, 150 o 1200 por ejemplo, no sigue un patrón.
3) Alias: Ya probé cambiandolos, el problema no viene por ese lado.
4) Lo dividí en 10 tablas porque se producen picos con 300 accesos por segundo y es crucial la respuesta rápida. La idea era impedir que la tabla de registro se hiciese de unos 10.000.000 de registros, me pareció mejor tener 10 tablas de 1.000.000. Además si algo se cae o colapsa (nos ha pasado) va a ser mas fácil reconstruir las tablas sin son mas chicas. Salvo por este problema, me ha dado buenos resultados.
5) No se cual está bien realmente, porque la tabla está en constante movimiento y no puedo hacer un count a mano en cada una y comprarlo
6) Desde ayer estoy haciendo un LOCK TABLE por las dudas que haya cambios durante las consultas, pero tampoco es eso. Si bien el movimiento es constante, es baja, de unos 50 a 100 inserts por minuto.
No se que mas hacer...
Gracias
Saludos
dhcmega
Confirmado que de esta manera, el resultado es Correcto.
La otra consulta, en este momento solo tiene valores distintos para el día 23.
Ya probé hacer Analyze, Repair, Optmize y Check, no cambian los valores.
Gracias
select count(*) as cant, idOperador from (
select * from tabla0
union
select * from tabla1
union
...
select * from tabla8
union
select * from tabla9
)cant
WHERE DATE(fechaHora) = '2009-07-23'
Group by idOperador
En el primer caso count(*) cuenta el número de filas de la tabla unión de todas
En el segundo caso count(*)... group by X cuenta el número de filas de cada tabla una vez que han sido agrupadas?, debería dar un valor menor. Creo que el problema está relacionado de alguna manera con el uso del group by + count. Si la columna tiene valores nulos count no funciona como debe y si lo que quieres es contar el número de valores distintos ya que los vas a agrupar quizás sea mejor usar algo como count(DISTINCT idOperador) from table1 en su lugar
tampoco me gusta mucho lo de )cant, pero esa ya es otra historia
¿puedes especificar un poco como es la tabla de resultados que quieres obtener?
Hola, gracias por tu respuesta.
Yo quiero saber cuantos registros hay de cada operadora en cada tabla.
La otra alternativa es hacer 10 consultas y sumar todo desde el PHP.
Si lo hago asi, la primer consulta dan el mismo nro, pero la que da de menos, no siempre de igual de menos, cambian los valores, da una diferencia que va variando de entre menos 1000 a menos 100.
Confirmado que NO hay campos en NULL.
Pero ambas consultas deberían devolver los mismo totales.
Muchas gracias!
Saludos
dhcmega
para contar los registros de cada operadora supongo que tendríamos que partir de algo tipo
select count(idOperador) as cant, idOperador from tabla group by idOperador;
Y el problema está en definir correctamente qué cosa es "tabla", no creo que tengas que meter todas las columnas de todas las tablas, bastaría con la columnas idOperador en todos los casos. Si tablas diferentes tienen valores idOperador que coincidan la agrupación se complicará.
para atacar el problema supongo que podrías crear previamente una vista o tabla nueva y agrupar posteriormente sobre dicha tabla, es decir meter la condición where directamente en tu vista
Otra posibilidad es que quisieramos trabajar con un campo numérico, por ejemplo encontrar el total de caja que hace la operadora X, supongamos que tenemos una lista de cantidades vendidas por determinado operador o empleado y queremos ver quien ha vendido más, para ello podríamos hacer algo tipo
select sum(cantidad) as facturacion, idOperador from tabla group by idOperador order by facturacion;
Por otra parte, no acabo de entender el motivo de escribir cant inmediatamente tras el corchete que cierra la tabla, podría estar afectando al where posterior, ¿para que lo pones?
Ok, hice mas pruebas y estoy indignado. O hay un bug terrible o estoy comiendo un error garrafal.
Primero paso a contestar tus preguntas y despues a exponer otra prueba, que he hecho en base a lo que me has dicho.
Tu consulta de punto de partida está bien, lo que tengo que hacerlo para las 10 tablas. Yo también creo que no hace falta meter todas las columnas, solo idOperador (para contarlos y agruparlos) y fechaHora (para filtrar en el where). Las 10 tablas tienen valores de idOperador que van de 1 a 3.
Escribo cant al final del paréntesis de los selects con union porque si no da un error, pone que cada tabla derivada tiene que tener su propio nombre. Creo que es ponerle un nombre a la tabla temporal que se genera.
Ahora las pruebas, esto es terrible para mi, no entiendo como es que sucede:
Consulta:
select count(*)as cant, idOperador from (
select idOperador, fechaHora from tabla0
union
select idOperador, fechaHora from tabla1
union
select idOperador, fechaHora from tabla2
union
select idOperador, fechaHora from tabla3
union
select idOperador, fechaHora from tabla4
union
select idOperador, fechaHora from tabla5
union
select idOperador, fechaHora from tabla6
union
select idOperador, fechaHora from tabla7
union
select idOperador, fechaHora from tabla8
union
select idOperador, fechaHora from tabla9
)cant
WHERE DATE(fechaHora) = '2009-07-21'
Group by idOperador
Resultado:
cand idOperador
241 1
28820 2
1301 3
Consulta:
select count(*)as cant, idOperador from (
select * from tabla0
union
select * from tabla1
union
select * from tabla2
union
select * from tabla3
union
select * from tabla4
union
select * from tabla5
union
select * from tabla6
union
select * from tabla7
union
select * from tabla8
union
select * from tabla9
)cant
WHERE DATE(fechaHora) = '2009-07-21'
Group by idOperador
Resultado:
cant idOperador
241 1
61098 2
1876 3
En las tablas, todas, hay constantes inserts, no hay ningún tipo de update, solo inserts.
Como puede ser que arrojen datos TAN distintos para una fecha en el paso que por supuesto no se modifica!!!
Gracias
Saludos
dhcmega