Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta dato no esperado

Estas en el tema de Consulta dato no esperado en el foro de Mysql en Foros del Web. Buenos dias, tengo esta consulta, @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT   c.idcatventanilla , COUNT ( a.idcatventanilla ) Total FROM catventanilla c LEFT JOIN ...
  #1 (permalink)  
Antiguo 19/01/2015, 10:57
 
Fecha de Ingreso: mayo-2014
Ubicación: Mexico
Mensajes: 79
Antigüedad: 10 años
Puntos: 2
Consulta dato no esperado

Buenos dias, tengo esta consulta,
Código MySQL:
Ver original
  1. SELECT   c.idcatventanilla, COUNT(a.idcatventanilla) Total FROM catventanilla c LEFT JOIN agenda a ON
  2. c.idcatventanilla = a.idcatventanilla WHERE TRUE AND c.idcatagencia= 'dk09a'
  3. AND horai = '2015-01-19 10:50' OR
  4. c.idcatventanilla IS NULL GROUP BY idcatventanilla ORDER BY total ASC

pero lo que quiero es que se me salgan todas las ventanillas, aunque el total sea 0, porque nada mas aparece idventanilla que solo cumple la condicion
  #2 (permalink)  
Antiguo 19/01/2015, 11:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta dato no esperado

En el contexto de tu consulta, c.idcatventanilla nunca puede dar NULL porque es la tabla izquierda. En el LEFT JOIN la no coincidencia es siemrpe de izquierda a derecha, es decir sólo la tabla derecha puede devolver nulos.
Si en tu caso, puede haber nulos tanto a la izquierda como a la derecha, entonces está faltando una tabla que se relaciona con esas dos, donde pueden estar todas las relaciones.

Si Agenda contiene todo, entonces la consulta sería:
Código MySQL:
Ver original
  1.    c.idcatventanilla,
  2.    COUNT(a.idcatventanilla) Total
  3.    agenda a
  4.    LEFT JOIN catventanilla c ON c.idcatventanilla = a.idcatventanilla
  5.    AND c.idcatagencia= 'dk09a'
  6.    AND horai = '2015-01-19 10:50'
  7.    OR c.idcatventanilla IS NULL
  8. GROUP BY idcatventanilla

No te olvides que al usar LEFT o RIGHT, el orden de los factores SI altera el producto...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/01/2015, 11:35
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta dato no esperado

Hola plasma_go:

Adicionalmente a lo que comenta gnzsoloyo, debes tener cuidado con el uso del AND y el OR en el WHERE... te recuerdo que estos dos operadores NO TIENEN LA MISMA JERARQUÍA.

Haciendo la analogía con las matemáticas, no es lo mismo:

Código:
3 + 5 * 2 = 13       a        (3 + 5) * 2 = 16
Con el uso del AND y el OR pasa lo mismo... no es lo mismo poner

Código:
campo = 1 and campo = 2 or campo = 3 

a

campo = 1 and (campo = 2 or campo = 3)
Ojo con eso.

Saludos
Leo.
  #4 (permalink)  
Antiguo 19/01/2015, 12:58
 
Fecha de Ingreso: mayo-2014
Ubicación: Mexico
Mensajes: 79
Antigüedad: 10 años
Puntos: 2
Respuesta: Consulta dato no esperado

Gracias por responder, resulta que lo probe (lo copie y pege), pero no me da el resultado esperado. Estuve tratando de ver poque no se podia, pero no lo encontre
  #5 (permalink)  
Antiguo 19/01/2015, 13:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta dato no esperado

Muestra los datos que tiene cada tabla, los datos que obtienes, y los que tu supones que deberías obtener.

Sin ver los casos concretos no se peude evaluar correctamente el problema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 19/01/2015, 13:22
 
Fecha de Ingreso: mayo-2014
Ubicación: Mexico
Mensajes: 79
Antigüedad: 10 años
Puntos: 2
Respuesta: Consulta dato no esperado

Estructura de las tablas:

Tabla agenda:
Código MySQL:
Ver original
  1. CREATE TABLE `agenda` (
  2.   `idAgenda` int(11) NOT NULL AUTO_INCREMENT,
  3.   `Rpu` varchar(12) DEFAULT NULL,
  4.   `HoraI` datetime DEFAULT NULL,
  5.   `HoraF` datetime DEFAULT NULL,
  6.   `idCausa` int(11) NOT NULL,
  7.   `idcatMatrix` int(11) NOT NULL,
  8.   `IsAllDayEvent` smallint(6) DEFAULT NULL,
  9.   `Color` varchar(1) DEFAULT NULL,
  10.   `idcatVentanilla` int(11) NOT NULL,
  11.   `Rpe` varchar(5) DEFAULT NULL,
  12.   PRIMARY KEY (`idAgenda`),
  13.   KEY `fk_Agenda_Causa1` (`idCausa`),
  14.   KEY `fk_Agenda_catMatrix1` (`idcatMatrix`),
  15.   KEY `fk_Agenda_catVentanilla1` (`idcatVentanilla`),
  16.   KEY `fk_Agenda_catUsuario1` (`Rpe`)

Tabla catventanilla
Código MySQL:
Ver original
  1. CREATE TABLE `catventanilla` (
  2.   `idcatVentanilla` int(11) NOT NULL AUTO_INCREMENT,
  3.   `idcatAgencia` varchar(5) DEFAULT NULL,
  4.   `noVentanilla` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`idcatVentanilla`)

select * from agenda

'10', '444444444444', '2015-01-16 08:00:00', '2015-01-16 08:10:00', '6', '1', '0', '1', '2', NULL
'11', '255899666333', '2015-01-20 08:00:00', '2015-01-20 08:10:00', '2', '1', '0', '1', '3', NULL
'12', '233333333333', '2015-01-09 08:00:00', '2015-01-09 08:10:00', '1', '2', '0', '1', '7', NULL
'13', '111111111111', '2015-01-14 12:20:00', '2015-01-14 12:30:00', '1', '2', '0', '1', '6', NULL
'14', '461564604654', '2015-01-13 13:10:00', '2015-01-13 13:20:00', '1', '2', '0', '1', '7', NULL
'15', '555555555555', '2015-01-14 13:00:00', '2015-01-14 13:10:00', '2', '2', '0', '1', '6', NULL
'16', '116551601111', '2015-01-14 12:20:00', '2015-01-14 12:30:00', '1', '2', '0', '6', '5', '9a0kl'
'17', '546546213215', '2015-01-14 12:30:00', '2015-01-14 12:40:00', '8', '2', '0', '1', '6', NULL
'18', '444444444444', '2015-01-27 08:00:00', '2015-01-27 08:10:00', '2', '2', '0', '1', '5', NULL
'19', '333444444444', '2015-01-16 08:00:00', '2015-01-16 08:10:00', '2', '2', '0', '1', '5', NULL
'20', '666666666666', '2015-01-21 08:00:00', '2015-01-21 08:10:00', '6', '1', '0', '1', '4', NULL

Resultado esperado:
idcatventanilla,total
'6', '1'
'5', '1'
'7', '0'
  #7 (permalink)  
Antiguo 19/01/2015, 13:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta dato no esperado

SI los datos son los que muestras, y las condiciones del WHERE son las indicadas en el primer post, y además hay en la tabla catventanilla (cuyos datos NO muestras) al menos siete categorías, la consulta que pones debería devolver cero en la columna "TOTAL", ya que no tienes ningun registro que cumpla con el requisito:

Código MySQL:
Ver original
  1. horai = '2015-01-19 10:50'

...por supuesto, eso si cambiaste el orden de las tablas.
De lo contrario no devolvería registros.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 19/01/2015, 13:35
 
Fecha de Ingreso: mayo-2014
Ubicación: Mexico
Mensajes: 79
Antigüedad: 10 años
Puntos: 2
Respuesta: Consulta dato no esperado

select * from catventanilla

idcatventanilla, idcatagencia, noventanilla
'1', 'DK04G', '1'
'2', 'DK04G', '2'
'3', 'DK04G', '3'
'4', 'DK04G', '4'
'5', 'DK09A', '1'
'6', 'DK09A', '2'
'7', 'DK09A', '3'
  #9 (permalink)  
Antiguo 19/01/2015, 13:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta dato no esperado

Ok, con ese contexto, los datos se entienden un poco mejor, y allí SI tiene sentido el orden de las tablas.
Pero el problema indicado persiste: Este valor no existe en la tabla de Agenda para el campo HORAI: '2015-01-19 10:50', en consecuencia, solo podría devolverte las categorias de ventanillas con valores de TOTAL en cero.
Mira con cuidado la tercera columna de tus datos y verás que esa fecha y hora no existen en la tabla.

Entendamos esto: Sólo puede contar aquellos registros de la tabla "Agenda" que obtengan datos validos para "horai". El resto se vinculan como NULL, por lo tanto valen cero.

Por tanto, dada esta consulta:
Código MySQL:
Ver original
  1.    c.idcatventanilla,
  2.    COUNT(a.idcatventanilla) Total
  3.    catventanilla c
  4.    LEFT JOIN agenda a ON c.idcatventanilla = a.idcatventanilla
  5.    AND c.idcatagencia= 'dk09a'  -- Solo devolvería el registro 5
  6.    AND a.horai = '2015-01-19 10:50' -- No devuelve registros
  7.    OR a.idcatventanilla IS NULL -- Este se corrige, estaba MAL.
  8. GROUP BY idcatventanilla
  9. ORDER BY total ASC;
Eso deberia devolverte ceros en la columna total...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 19/01/2015, 14:05
 
Fecha de Ingreso: mayo-2014
Ubicación: Mexico
Mensajes: 79
Antigüedad: 10 años
Puntos: 2
Respuesta: Consulta dato no esperado

Muchas gracias gnzsoloyo, me ayudaste bstante, pero no podre utilizarlo como pensaba, pero con php lo podre adecuar

Etiquetas: dato, join, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:07.