Forum
Arkadaşlar kolay gelsin, bir kaç günden beri içinden çıkmaya çalıştığım bir problem var. Konu özetle şudur ki;
Otel rezervasyon sisteminde girilen tarihler arasında ki müsait oda tiplerini ve bu tiplerin içinde kaç odanın boş olduğunu ekrana yazdırmak. Yapı şu şekilde;
Oda
oda_id
oda_tip_id (tip tablosundaki tip id si)
oda_nu
Tip
tip_id
tip_adi ( suit oda, kral oda vs. gibi oda tipleri )
Rezervasyon
rezervasyon_id
rezervasyon_gir_tar (giriş tarihi 01.01.2012)
rezervasyon_cik_tar (çıkış tarihi 15.01.2012)
rezervasyon_oda_id ( rezervasyonu yapılmış odanın id si )
yani rezervasyon tablosunda, giriş ve çıkış tarihleri arasıda rezervasyon kaydı omayan odaların sayısı ile odası o tarihlerde boş olan tip idlerinin sorgulanması.
Benim yapabildiğim kadarı ile yaklaşık sql şu şekilde ama sorgulama tarihleri arasında, o odanın birinci kaydı yoksa odayı boş olarak gösteriyor ama altında gene aynı odanın rezervasyonu varsa bu odayı daha önceden müsaitlediği için dolu olarak göstermiyor ayrıca count olayıda yok
SELECT
*
FROM
oteldb.tip
WHERE
tip.tip_id IN
( SELECT
oteldb.oda.oda_tip_id
FROM
oteldb.oda
WHERE
oda.oda_id not IN
(SELECT
oteldb.rezervasyon.rezervasyon_oda_id
FROM
oteldb.rezervasyon
WHERE
"2012-01-03" BETWEEN rezervasyon_gt AND rezervasyon_ct
AND "2012-01-22" BETWEEN rezervasyon_gt AND rezervasyon_ct ) )
Yardımcı olacak, olamaya çalışacak arkadaşlara şimdiden şükranlarımı sunuyorum...
-----------------------------------------------------------------------
sql tablosunu oluşturmak isteyipde bana yardımcı olacak arkadaşlar için createler
CREATE TABLE oteldb.oda(
oda_id INT (11) NOT NULL AUTO_INCREMENT,
oda_tip_id INT (11) DEFAULT NULL,
oda_adi VARCHAR (20) DEFAULT NULL,
PRIMARY KEY (oda_id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;
---------------------------------------
CREATE TABLE oteldb.tip(
tip_id INT (11) NOT NULL AUTO_INCREMENT,
tip_adi VARCHAR (20) DEFAULT NULL,
PRIMARY KEY (tip_id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
ROW_FORMAT = FIXED;
-------------------------
CREATE TABLE oteldb.rezervasyon(
rezervasyon_id INT (11) NOT NULL AUTO_INCREMENT,
rezervasyon_gt DATE DEFAULT NULL,
rezervasyon_ct DATE DEFAULT NULL,
rezervasyon_oda_id INT (11) DEFAULT NULL,
PRIMARY KEY (rezervasyon_id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;
Merhabalar Mahmut Bey, sorunuz çok spesifik ve birden fazla soru içeriyor. İsterseniz sorunuzu parçalayarak ve geneli de kapsayacak şekilde sorun. Bu şekliyle açıkcası danışmanlık işi gibi duruyor. Cevap gelmesi de bu yüzden zor olacaktır.
Dediğiniz gibi sorgu biraz karmaşık ve iç içe birkaç problemi bir arada içeriyor.
Aşama aşama anlatmam gerekirse ;
Problemden önce bilinmesi gerekenler...
3 adet tablom var
1- Oda Tipleri (Kral,Süit,Normal vs..)
2- Odalar (odalar tablosunda odaların id leri, isimleri, vs odatipi idleri var odanın kral dairesimi süit mi olduğunu bilmek için)
3- Rezervasyonlar (burada daha önceden rezervasyon yapılmış odaların kayıtları var)
Benim query ile ulaşmak istediğim sonuç, girdiğim iki tarih arasında hangi oda tiplerinden kaç adet boş oda olduğunu bulmak. Yani;
toplamda
3 süit dairesi
4 kral dairesi
5 normal oda
var diyelim rezervasyolar tablosunda 1 adet oda "03.01.2012"-"10.01.2012" tarihleri arasında rezerve edili olsun ve bu odanın tipi kral dairesi olsun.
eğer ben bu tarihler arasında bir sorgulama yaparsam bana sonuç olarak
3 süit dairesi
3 kral dairesi
5 normal oda
dönmesini istiyorum umarım problemimi anlatabilmişimdir, iyi çalışmalar.
Aslında aşağıdaki sorgu istediğimi sonuca ramak kalmış ama başarılı olamadığım bir sorgu..
select t.tip_adi, count(oda.oda_tip_id)
from oteldb.tip t
left join (select oda_tip_id
from oteldb.oda o
where not exists
(select null
from oteldb.rezervasyon r
where r.rezervasyon_oda_id = o.oda_id and
r.rezervasyon_gt <= '2012-01-22' and
'2012-01-03' <= r.rezervasyon_ct)
) oda on oda.oda_tip_id = t.tip_id
group by t.tip_adi
Hocam yanıt aslındasoruda yazdığım şekildeymiş.. Geç saatlerde düzgün gözlemleyememişim sonuçlerı..
"
select t.tip_adi, count(oda.oda_tip_id)
from oteldb.tip t
left join (select oda_tip_id
from oteldb.oda o
where not exists
(select null
from oteldb.rezervasyon r
where r.rezervasyon_oda_id = o.oda_id and
r.rezervasyon_gt <= '2012-01-22' and
'2012-01-03' <= r.rezervasyon_ct)
) oda on oda.oda_tip_id = t.tip_id
group by t.tip_adi
"