2011-01-11 24 views
12

Tengo problemas para seleccionar valores de la tabla a (id, room_name) donde no hay eventos correspondientes en la tabla b (room_id, room_start, room_finish)mysql: seleccione todos los elementos de la tabla A si no existe en la tabla B

mi consulta busca siguiente

 
SELECT id, room_name FROM rooms 
WHERE NOT EXISTS 
(SELECT * FROM room_events 
    WHERE room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200') 

la tabla a contiene varias habitaciones, la tabla B contiene eventos habitaciones estoy recibiendo ningún resultado en caso de que haya cualquier caso para cualquiera de las habitaciones dentro de las marcas de tiempo. Espero que todas las habitaciones NO tengan eventos.

Respuesta

22

Aquí es el prototipo de lo que quiere hacer:

SELECT * FROM table1 t1 
    WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t1.id = t2.id) 

Aquí, id se supone que es el PK y FK en ambas tablas. Debe ajustar en consecuencia. Tenga en cuenta también que es importante comparar PK y FK en este caso.

lo tanto, aquí es cómo su consulta debe verse como:

SELECT id, room_name FROM rooms r 
WHERE NOT EXISTS 
(SELECT * FROM room_events re 
    WHERE 
      r.room_id = re.room_id 
      AND 
      (
      room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200') 
     ) 

Si lo desea, compruebe las partes de tu consulta por ejecutarlas en el cliente de MySQL. Por ejemplo, puede asegurarse de que si las siguientes declaraciones de cualquier registro o no:

SELECT * FROM room_events 
    WHERE room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200' 

Si no lo hace, se han encontrado al culpable y actuar en consecuencia con otras partes :)

+0

gracias, hace el trabajo, creo que me olvidé de poner paréntesis mientras lo intentaba. – m1k3y3

0

Te faltan a use solo los eventos de esa habitación. Eso se hace al hacer coincidir la identificación.

SELECT id, room_name FROM rooms r 
WHERE NOT EXISTS 
(SELECT * FROM room_events re 
     WHERE r.id = re.room_id AND 
     room_start BETWEEN '1294727400' AND '1294729200' 
     OR 
     room_finish BETWEEN '1294727400' AND '1294729200') 
+0

Todavía no obtengo ningún resultado :-( – m1k3y3

+0

Me perdí la parte de identificación de la tabla de la que se deben tomar los campos. –

Cuestiones relacionadas