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

¿Consulta sin datos duplicados entre dos tablas?

Estas en el tema de ¿Consulta sin datos duplicados entre dos tablas? en el foro de Mysql en Foros del Web. Hola! Hace días que estoy haciendo pruebas para poder realizar una consulta mysql para que me devuelva ciertos valores entre dos tablas, el problema es ...
  #1 (permalink)  
Antiguo 15/04/2012, 00:41
Avatar de gepd  
Fecha de Ingreso: diciembre-2007
Mensajes: 142
Antigüedad: 16 años, 4 meses
Puntos: 6
¿Consulta sin datos duplicados entre dos tablas?

Hola!

Hace días que estoy haciendo pruebas para poder realizar una consulta mysql para que me devuelva ciertos valores entre dos tablas, el problema es que los envía duplicados, se la razón, pero no sé como solucionarlo, ahora la explicación:

Tengo dos tablas

Código MySQL:
Ver original
  1. TABLE `lista_horarios` (
  2.   `id`,
  3.   `horaIn`,
  4.   `horaOut`,
  5. );
y

Código MySQL:
Ver original
  1. TABLE `horario` (
  2.   `hid`,
  3.   `id_usuario`,
  4.   `id_horario`,
  5.   `fecha`,
  6.   `registrado`,
  7. );

en la tabla lista_horarios tengo una lista de horarios, estos sirven para listarlos cada día (el código es para un sistema de turnos)

en la tabla horario guardo el id del usuario, id del horario, la fecha que seleccionó para el turno y un registro con fecha y hora de cuando realizó la operación.

lo que deseo hacer es listar todos los horarios de la tabla 'lista_horarios' pero a excepción de lo que ya se han tomado para una fecha concreta (hay otras funciones del código que no menciono, porque no son parte del problema)


la consulta que hago para eso es

Código MySQL:
Ver original
  1. SELECT id, horaIn, horaOut
  2. FROM lista_horarios
  3. INNER JOIN horario ON id <> id_horario
  4. AND id_usuario =  '1'
  5. AND fecha =  '2012-04-15'

y me devuelve el doble de registros que tengo menos los que corresponden, esos no los duplica

sería algo como

id 1
id 1
id 2
id 3
id 3
id 4
id 4

el "problema" es que de la tabla horario hay veces que hay más de un resultado, porque un mismo usuario puede haber tomado dos turnos ese mismo día y quizás quiera tomar un tercero
quiere decir que si yo hago un

Código MySQL:
Ver original
  1. SELECT id, horaIn FROM lista_horarios WHERE id_usuario = '1' AND fecha = '2012-04-15'

el resultado podría ser
1 - 09:30
2 - 12:00

es por eso que duplica mis resultados, lo que no sé es cómo hacer para que no los duplique intenté con GROUP BY y DISTINCT, pero al hacerlo obtengo todos los registros, incluyendo los que quiero que no aparezcan.

espero haber sido claro
  #2 (permalink)  
Antiguo 15/04/2012, 12:57
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ¿Consulta sin datos duplicados entre dos tablas?

La explicación a este problema exacto se encuentra en la guía de Zend:

Código SQL:
Ver original
  1. The most common TYPE OF JOIN IS called an INNER JOIN. It works BY returning the ROWS
  2. FROM two TABLES IN which a common KEY expression IS satisfied BY BOTH TABLES. Here’s an
  3. example:
  4. SELECT *
  5. FROM table1 INNER JOIN table2 ON table1.id = table2.id
  6. WHEN executing this query, the DATABASE will look at the table1.id = table2.id con-
  7. dition AND ONLY RETURN those ROWS FROM BOTH TABLES WHERE it IS satisfied.You might think
  8. that BY changing the condition TO table1.id <> table2.id, you could find ALL the
  9. ROWS that appear IN one TABLE but NOT the other. IN fact, this causes the DBMS TO actually
  10. GO through each ROW OF the FIRST TABLE AND EXTRACT ALL the ROWS FROM the SECOND TABLE
  11. WHERE the id COLUMN doesn’t have the same VALUE, AND THEN do so FOR the SECOND ROW,
  12. AND so forth—AND you’ll END up WITH a resultset that contains every ROW IN BOTH TABLES
  13. many times OVER.
Utiliza left join para resoverlo. Saludos
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 15/04/2012, 15:44
Avatar de gepd  
Fecha de Ingreso: diciembre-2007
Mensajes: 142
Antigüedad: 16 años, 4 meses
Puntos: 6
Respuesta: ¿Consulta sin datos duplicados entre dos tablas?

Gracias por tu respuesta repara2, ya había intentado con LEFT JOIN, peor el resultado es el mimo, incluso ejecutando algo menos complicado a lo anterior

Código MySQL:
Ver original
  1. FROM lista_horarios
  2. LEFT JOIN horario ON id <> id_horario

en este caso el resultado es el mismo:

Código:
1
1
2
3
4
4
5
5
6
6
7
7
2 y 3 ya están en la tabla 'horarios' es por eso que no se repite, como dije antes al hacer un GROUP BY o DISTINCT elimina los repetidos, pero queda la lista completa de id, y los 2 que deberían desaparecer se mantienen
  #4 (permalink)  
Antiguo 15/04/2012, 23:08
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ¿Consulta sin datos duplicados entre dos tablas?

Claro que es el mismo resultado, es que no puedes usar el operador <> porque tiene justamente el efecto que quieres evitar. Utiliza = y luego en el where filtras los registros que no quieres.
__________________
Fere libenter homines, id quod volunt, credunt.

Etiquetas: duplicados, join, registros, select, sql, tabla
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 09:19.