2012-12-20 5 views
4

Bonjour j'ai 2 chambres tables et réservations mais ma table Sturcture peu différent, dans les réservations tableau il y a RoomID, la date, le statut par exemple:vérifier la disponibilité des chambres avec plage de dates

101,2012-12-10,0 
101,2012-12-11,0 
101,2012-12-12,1 
101,2012-12-13,0 
102,2012-12-10,0 
102,2012-12-11,0 
102,2012-12-12,0 

et je voudrais pour trouver des chambres disponibles entre le 2012-12-10 et le 2012-12-13 selon cette demande seule la chambre 102 devrait être retournée.

j'ai essayé

SELECT id 
FROM status 
WHERE status='0' 
    AND date between '2012-12-10' AND '2012-12-13' 
GROUP BY id 

cela ne fonctionne pas parce que même trouver qu'une seule ligne disponible, il retourne vrai pour 101

donc 101 est disponible pour 11.12.2012 ensuite montrer comme disponible mais pas d'accord pour notre gamme de données.

+0

Est-ce votre type de données pour la colonne Date DateTime? – SnareChops

+0

oui date colonne – canerkoroglu

+0

voulez-vous utiliser entre, ou est-il préférable d'utiliser> = et fthiella

Répondre

1

Cela sélectionnera toutes les chambres qui ont pas de ligne avec status=1 dans l'intervalle vous sélectionnez. Notez que je ne suis pas en utilisant between: si status=1 le 13 Décembre, la salle est toujours disponible dans l'intervalle, c'est la raison pour laquelle j'utilise >= and <:

SELECT roomid 
FROM status 
WHERE `date` >= '2012-12-10' 
     AND `date` < '2012-12-13' 
GROUP BY roomid 
HAVING sum(status.status=1)=0 

S'il pourrait aussi y avoir quelques jours manquants dans votre table , et si cela signifie que la pièce ne soit pas réservé, mais pas non plus disponible, vous pouvez également utiliser cette requête:

SELECT roomid 
FROM status 
WHERE `date` >= '2012-12-10' 
     AND `date` < '2012-12-13' 
     AND status=0 
GROUP BY roomid 
HAVING count(*)=DATEDIFF('2012-12-13', '2012-12-10') 

qui vérifie que le nombre de jours dans l'intervalle est égal au nombre de lignes avec l'état = 0

+0

J'ai modifié cette requête comme ça, mais ça ne marche pas, où est le problème? SELECT éd. * FROM emlaklar ed INNER JOIN ((CHOISIR emlak_id FROM fiyatlar OERE 'tarih' entre '2012-12-10' ET '2012-12-18' GROUP BY emlak_id AYANT somme (durum = 1) = 0) AS f ON ed.id = f.emlak_id) – canerkoroglu

+0

@ user1919682 Je pense que vous n'avez pas besoin du double '((' ', vous n'avez besoin que d'un seul et vous pouvez supprimer la fermeture') 'à la fin – fthiella

+0

cela fonctionne maintenant vraiment intéressant :) Merci beaucoup. – canerkoroglu

1

Si la date a un temps qui lui est associée, vous devez faire quelque chose comme ceci:

SELECT id 
FROM status 
WHERE status='0' 
    AND date between '2012-12-10 00:00:00' AND '2012-12-13 23:59:59' 
GROUP BY id 

Vous pouvez également utiliser la date (date) au lieu d'inclure les temps, mais cela pourrait être moins efficace.

+0

j'ai essayé mais même parce que si vous vérifiez la requête de table de réservations peut trouver disponible une date libre comme 2012-12-11, cette date est disponible mais 2012-12-12 n'est pas. Les résultats s'affichent comme disponibles mais non autorisés. – canerkoroglu

+0

Selon les dates auxquelles vous souhaitez être inclus, vous devez simplement modifier les heures et les dates. – lilwupster

1

Vous devriez pouvoir utiliser les éléments suivants:

SELECT roomid 
FROM status s1 
WHERE status='0' 
    AND date between '2012-12-10' AND '2012-12-13' 
    and not exists (select roomid 
        from status s2 
        where status='1' 
        AND date between '2012-12-10' AND '2012-12-13' 
        and s1.roomid = s2.roomid) 
GROUP BY roomid 

Voir SQL Fiddle with demo

1

Essayez ceci:

SELECT rd.* 
FROM room_details rd 
INNER JOIN (SELECT DISTINCT roomid FROM bookings 
      WHERE roomid NOT IN (SELECT roomid FROM bookings 
           WHERE STATUS =0 AND DATE BETWEEN '2012-12-10' AND '2012-12-13') 
       ) AS a ON rd.roomid = a.roomid 
+0

oui cela fonctionne, comment puis-je rejoindre cette requête avec la table room_details? – canerkoroglu

+0

Utilisez la sortie de cette requête comme table et rejoignez cette table avec les détails de la chambre comme select * from roomdetails rd jointure interne (ci-dessus requête) comme sur rd.roomid = a.id –

+0

pourriez-vous partager une requête complète s'il vous plaît je ne pouvais pas comprendre exactement ? – canerkoroglu

0

La condition SQL BETWEEN renverra les enregistrements où expression est comprise dans la plage de valeur1 et valeur2 (inclus). Donc, la ligne 101,2012-12-10,0 doit être renvoyée pour la requête mentionnée ci-dessus.

0

Essayez ceci:

SELECT roomid 
FROM status 
WHERE 'date_from' <= "2012-12-10" AND 'date_to' > "2012-12-10" AND 'status'= 0; 
Questions connexes