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

Select de 3 tablas y un campo tenga dos valores

Estas en el tema de Select de 3 tablas y un campo tenga dos valores en el foro de Mysql en Foros del Web. Hola tengo un problema al hacer un select de distintas tablas el codigo es el siguiente Código: SELECT count(DISTINCT PACIENTE.CURP) FROM (Paciente INNER Join Consulta ...
  #1 (permalink)  
Antiguo 25/06/2012, 20:30
 
Fecha de Ingreso: marzo-2011
Ubicación: Parral
Mensajes: 8
Antigüedad: 7 años, 6 meses
Puntos: 0
Select de 3 tablas y un campo tenga dos valores

Hola tengo un problema al hacer un select de distintas tablas el codigo es el siguiente

Código:
SELECT count(DISTINCT PACIENTE.CURP)
FROM (Paciente INNER Join Consulta on Paciente.Curp = Consulta.Curp) LEFT join sintomas
on consulta.idconsulta = sintomas.idconsulta
WHERE (sINTOMA='OBESIDAD' OR SINTOMA ='MELLITUS')
en el necesito forzosamente que cada paciente tenga ambos sintomas
  #2 (permalink)  
Antiguo 25/06/2012, 20:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.304
Antigüedad: 10 años, 10 meses
Puntos: 2646
Respuesta: Select de 3 tablas y un campo tenga dos valores

Suponiendo que las relaciones sean las que se infieren:
Código MySQL:
Ver original
  1.     COUNT(DISTINCT PACIENTE.CURP) TotalPacientes
  2.     Paciente P
  3.     INNER JOIN Consulta C ON P.Curp = C.Curp)
  4.     INNER JOIN sintomas S1 ON  C.idconsulta = S1.idconsulta
  5.     INNER JOIN sintomas S2 ON  C.idconsulta = S2.idconsulta
  6.     S1.SINTOMA = 'OBESIDAD'
  7.     AND S2.SINTOMA ='MELLITUS'
Si debe ser que tenga ambos síntomas forzosamente no corresponde usar LEFT JOIN sino INNER JOIN
__________________
¿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 25/06/2012, 21:02
 
Fecha de Ingreso: marzo-2011
Ubicación: Parral
Mensajes: 8
Antigüedad: 7 años, 6 meses
Puntos: 0
Respuesta: Select de 3 tablas y un campo tenga dos valores

Hola e intentado con tu codigo pero me arroja 0 cuando realmente tengo 1 paciente que tiene ambos sintomas

Usando este codigo (que realmente creo esta mal ) me arroja el valor de 1
Código MySQL:
Ver original
  1. select count(paciente.curp)as I1
  2. from (Paciente INNER Join Consulta on Paciente.Curp = Consulta.Curp)
  3.          left join sintomas on sintomas.idconsulta = Consulta.idconsulta
  4. where Paciente.curp in(
  5.     SELECT DISTINCT PACIENTE.CURP
  6.     FROM (Paciente INNER Join Consulta on Paciente.Curp = Consulta.Curp)
  7.          left join sintomas on sintomas.idconsulta = Consulta.idconsulta
  8.     where Sintoma='obesidad'
  9. ) and Sintoma='mellitus'
  #4 (permalink)  
Antiguo 25/06/2012, 21:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.304
Antigüedad: 10 años, 10 meses
Puntos: 2646
Respuesta: Select de 3 tablas y un campo tenga dos valores

LEFT JOIN devuelve todo lo que está en la tabla de la izquierda, tenga o no relación con la tabla derecha.
En el contexto de tu consulta, cuenta los pacientes que tengan alguna relación con una consulta, donde haya algún síntoma detectado en esa consulta. Pero eso no significa que tenga ambos síntomas, sino que al menos tiene uno.
Para que se de que tenga ambos síntomas debe cumplirse que:
1) Sea un paciente que haya tenido una consulta.
2) Que en una única consulta consulta se hayan encontrado si o sí ambos síntomas.

En esencia, el paciente tiene que ser tal que se cumpla que su consulta esté inncluida en:
Código MySQL:
Ver original
  1. SELECT idconsulta
  2. FROM sintoma S
  3. WHERE s.sintoma IN('obesidad', 'mellitus')
  4. GROUP BY idconsulta
  5. HAVING COUNT(*) = 2;

Por tanto, la consulta sería:
Código MySQL:
Ver original
  1. SELECT COUNT(DISTINCT P.Curp) totalPacientes
  2. FROM paciente p INNER JOIN consulta C ON P.Curp = C.Curp
  3. WHERE C.idconsulta IN (SELECT idconsulta
  4.            FROM sintoma S
  5.            WHERE s.sintoma IN('obesidad', 'mellitus')
  6.            GROUP BY idconsulta
  7.            HAVING COUNT(*) = 2);

Sintetizando: Si la primera consulta que te pongo no devuelve datos, es que no hay ninguna consulta donde se hayan encontrado ambos síntomas, o es posible que estén mal cargados los datos.

Tips:
1) Usa alias para las tablas. Simplifica la escritura y la hace más legible.
2) No pongas paréntesis porque sí. En MySQL pueden generar un orden de lectura ineficiente.
3) No uses funciones agregadas sin poner alias. Después se te complicará cuando pases a programar en un lenguaje y trates de tomar los datos.
4) No uses los mismos nombres para los campos que para las tablas, pueden producir errores en las consultas que son casi indetectables (estás usando síntoma para ambas cosas, los resultados pueden ser incorrectos.).
5) Estudia bien el uso de LEFT / INNER / RIGHT JOIN. No se ponen porque sí. Cada uno tiene un tipo de consulta donde es eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/06/2012, 23:08
 
Fecha de Ingreso: marzo-2011
Ubicación: Parral
Mensajes: 8
Antigüedad: 7 años, 6 meses
Puntos: 0
Respuesta: Select de 3 tablas y un campo tenga dos valores

Hola gracias por la ayuda y los consejos, mañana lo intento como esta tu codigo haber que tal
  #6 (permalink)  
Antiguo 26/06/2012, 12:10
 
Fecha de Ingreso: marzo-2011
Ubicación: Parral
Mensajes: 8
Antigüedad: 7 años, 6 meses
Puntos: 0
Respuesta: Select de 3 tablas y un campo tenga dos valores

Hola, Tu codigo funciona perfectamente, pero olvide decir por que no sabia como explicarme lo siguiente, el sintoma no necesariamente tiene que tener la misma idConsulta por que un paciente se puede consultar varias veces y presentar uno o varios sintomas en cada consulta
  #7 (permalink)  
Antiguo 26/06/2012, 13:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.304
Antigüedad: 10 años, 10 meses
Puntos: 2646
Respuesta: Select de 3 tablas y un campo tenga dos valores

Eso es un planeo completamente diferente...
Probemos así:
Código MySQL:
Ver original
  1. SELECT COUNT(*) TOTALPACIENTES
  2.     (SELECT P.Curp, COUNT(S1.idonsulta) C1, COUNT((S2.idonsulta) C2
  3.     FROM
  4.         paciente p
  5.         INNER JOIN consulta C ON P.Curp = C.Curp
  6.         LEFT JOIN sintoma S1 ON C.idconsulta = S1.idonsulta
  7.         LEFT JOIN sintoma S2 ON C.idconsulta = S2.idonsulta
  8.     WHERE
  9.         (S1.sintoma = 'obesidad'
  10.         OR
  11.         S2.sintoma = 'mellitus')
  12.     GROUP BY P.Curp) T1
  13. WHERE C1 > 0 AND C2>0;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, select, tabla, tablas, campos
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 18:39.