2011-01-11 3 views
12

Sto avendo un problema con la selezione dei valori da tavolo un (id, room_name) dove ci sono eventi corrispondenti in tabella b (room_id, room_start, room_finish)mysql: selezionare tutti gli elementi di tabella A se non esiste nella tabella B

mia domanda sembra seguente

 
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') 

tabella contiene più di un sale, tabella B contiene eventi camera sto ottenendo alcun risultato nel caso in cui non v'è comunque per una delle stanze all'interno dei timestamp. Mi aspetto che tutte le stanze non abbiano eventi.

risposta

22

Ecco il prototipo di ciò che si vuole fare:

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

Qui, id si presume essere il PK e FK in entrambe le tabelle. Dovresti modificare di conseguenza. Si noti inoltre che è importante confrontare PK e FK in questo caso.

Quindi, ecco come la query dovrebbe essere simile:

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') 
     ) 

Se si desidera, è controllare le parti della query da loro esecuzione nel client mysql. Ad esempio, è possibile assicurarsi che i seguenti rendimenti tutti i record o no:

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

se non, avete trovato il colpevole e agire di conseguenza con le altre parti :)

+0

grazie, fa il lavoro, penso di aver dimenticato di mettere le parentesi durante il tentativo. – m1k3y3

0

Ti manca a usa solo gli eventi da quella stanza. Questo viene fatto abbinando l'id.

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

Ancora non ottengo risultati :-( – m1k3y3

+0

Ho perso la parte di identificare la tabella da cui i campi devono essere presi. –