2016-02-23 14 views
6

Ci sono due tabelle nel mio database. Il primo tavolo è stanza e il secondo tavolo è la prenotazione. Nel mio tavolo della salaverifica la disponibilità della camera nell'hotel

id room_no type rate 
1 13  1b 1000 
2 14  2b 2000 
3 15  3b 3000 
4 16  1b 1000 
5 17  2b 2000 
6 18  3b 3000 

Nella mia tabella di prenotazione

id room_no check_in  check_out 
1 13  23-2-2016  24-2-2016 
2 14  24-2-2016  25-2-2016 
1 13  25-2-2016  26-2-2016 
1 13  27-2-2016  29-2-2016 
1 13  1-3-2016  2-3-2016 
1 13  7-3-2016  7-3-2016 

"SELECT room_no,type,rate 
      FROM room 
      WHERE room_no not in 
      (select IFNULL(GROUP_CONCAT(room_no),0) 
      FROM reservation 
      WHERE check_out >= '$check_in' AND check_in <= '$check_out')" 

quando seleziono una data 24-2-2016 al 27-2-2016 allora visualizzare

room_no check_in  check_out 

    14  24-2-2016  25-2-2016 
    15  25-2-2016  26-2-2016 
    16  27-2-2016  29-2-2016 
    17  1-3-2016  2-3-2016 
    18  7-3-2016  7-3-2016 

ma io vogliono tutte le stanze disponibili.

+1

si dovrebbe solo confrontare con la data di checkout e la data corrente .. –

+0

Seleziono la data nel modulo per data casella di testo di selezione .so quando seleziono la data 24-2-2016 a 27-2-2016 quindi visualizza room_no 14 , 15,16,17 e 18 ma voglio solo room_no che non sia tra queste date. Intendo la stanza disponibile –

risposta

0

si dovrebbe usare qualcosa di simile a questo:

"SELECT room_no, type, rate 
     FROM room 
     WHERE room_no not in 
     (select room_no FROM reservation 
     WHERE ('$check_in' BETWEEN check_in AND check_out) AND ('$check_out' BETWEEN check_in AND check_out))" 

Non so se la query è corretto, ma è sicuramente per verificare la presenza di mezzo. Non puoi testare solo per check_out> di data, e check_in < date. Se hai più prenotazioni questo ti darà errori !!

+0

che mostra l'errore Doktor OSwaldo –

+0

abbastanza possibile, devi confrontare Date, dovrai aggiungere alcune funzioni di data. Ad ogni modo la query è stata aggiornata un po ', ma dovrai anche investire un po' di lavoro;) –

4

ad avere camere occupato per il periodo specificato, cioè '2016-02-27'-'2016-02-24', è possibile utilizzare:

SELECT DISTINCT room_no 
FROM reservation 
WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24' 

uscita:

room_no 
======= 
13 
14 

Per ottenere le camere disponibili è possibile utilizzare la query precedente come questo :

SELECT * 
FROM room 
WHERE room_no NOT IN (
    SELECT DISTINCT room_no 
    FROM reservation 
    WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24') 

uscita:

id, room_no, type, rate 
======================= 
3, 15,  3b, 3000 
4, 16,  1b, 1000 
5, 17,  2b, 2000 
6, 18,  3b, 3000 

Demo here

+0

Questa query restituirà un errore se non c'è spazio disponibile in 'reservation'. Si prega di utilizzare la condizione 'IFNULL'. –

+0

Come signor ingegnere. –

+0

@ Mr.Engineer No, questo non è corretto. Se la prenotazione è vuota, la query restituirà tutte le stanze. –

0

Utilizzando un LEFT JOIN dovrebbe fare il trucco senza l'utilizzo di una sottoquery.

Qualcosa di simile a questo:

SELECT 
    room.room_no, 
    room.`type`, 
    room.rate, 
    COUNT(reservation.room_no) AS countReservation 
FROM 
    room 
LEFT JOIN reservation 
    ON (room.room_no = reservation.room_no) 
     AND (check_in <= '2016-02-24' AND check_out >= '2016-01-27') 
GROUP BY 
    room.room_no 
HAVING 
    countReservation = 0 

Un altro vantaggio in questa query è la colonna più countReservation che sarà anche dire se si dispone di 1 o più prenotazioni per il periodo di tempo per la data per ogni camera.

+0

Caro Benjamin C ...La query funziona ma qual è la differenza tra la tua query e la domanda di Giorgos Betsos .. non ho capito cosa stai cercando di dire ... ti prego di spiegarmi correttamente .... grazie –

+0

Beh, ci sono alcune differenze. Generalmente, l'utilizzo dei join è più rapido rispetto all'utilizzo di una sottoquery (una clausola 'SELECT' all'interno di una clausola' SELECT'). Anche una condizione 'NOT IN (...)' non è veloce perché il server deve indicizzare il risultato della subquery e controllare l'opposto di esso dopo. FYI Non ho collegamenti che confermino le mie supposizioni, è solo da esperienze personali su alcuni progetti passati con database di medie dimensioni (ad esempio, righe di contatti di 140k e righe di aziende di 70k). –