Autor | Zpráva | ||
---|---|---|---|
urquell Profil * |
#1 · Zasláno: 19. 4. 2015, 22:58:06
Ahoj,
dělám pro známého rezervaci pokojů k jeho apartmánu a potřeboval bych poradit, protože se k tomu programování zas tak často nedostanu. Mám tabulku rezervace, kde jsou sloupce (OD, DO, APARTMAN (cislo 1-4 apartmanu), jmeno, prijmeni,...). Nyní mám rezervační formulář a potřebuji ověřit zda v uživatelem zadaném termínu jsou již apartmány zabrané nebo ne. Lze to ověřit již na bázi MySQL? Nebo se to musí ošetřit v PHP? Napadlo mě, vytvořit pole se všemi zabranými termíny z db a to pak porovnat s daty co zadal uživatel, ale příjde mi to kompilkované. Proto se ptám zkušenějších. Předem moc děkuji... |
||
abc Profil |
#2 · Zasláno: 19. 4. 2015, 23:34:34
Např. takto lze zjistit pro konkrétní apartmán a pro konkrétní termín začátku pobytu apartmán obsazen:
SELECT COUNT(*) FROM rezervace WHERE APARTMAN = $apartman AND OD <= $start AND DO >= $start |
||
Alphard Profil |
#3 · Zasláno: 19. 4. 2015, 23:40:47
abc [#2]:
A čemu to pomůže, když neřešíš, do kdy ta rezervace je? Podmínka select count(*) from rezerace where APARTMAN = $apartman and OD <= $end and DO >= $start |
||
urquell Profil * |
#4 · Zasláno: 20. 4. 2015, 08:41:42
Potřeboval bych zjistit i čísla obsazených apartmánů. Rozumím tomu správně, pokud dám místo COUNT(*) pouze * a APARTMAN vymazu, bude to fungovat? A taky když bude DO třeba 20.4., tak to znamená, že již toho 20.4. se může člověk nastěhovat, protože v 10 ráno opustí a ve 14:00 můžou přijet noví návštěvníci. Bude to takto správně fungovat, když odstraním to = z DO?
Děkuji moc za vaše odpovědi. |
||
final_ Profil * |
#5 · Zasláno: 20. 4. 2015, 08:48:27
najlepšie bude keď si to napr. v phpmyadmin nasimuluješ
|
||
juriad Profil |
urquell:
Co tedy chceš? Výpis seznamu všech apartmánů s informací, zda je v zadaný termín volný? SELECT a.id, COUNT(r.apartman) > 0 AS obsazeny FROM apartmany AS a LEFT JOIN rezervace AS r ON a.id = r.apartman AND r.od < $end AND r.do > $start GROUP BY a.id Ta podmínka na předposledním řádku testuje, zda se rezervace překrývá. Zkus si promyslet všechny možnosti; vyjde to. Lze na to také nahlížet jako na „rezervace se nepřekrývají (začíná později, nebo končí dříve)“: r.od >= $end OR r.do <= $start a to pak znegovat.
Přesunuta podmínka do JOINu. |
||
urquell Profil * |
#7 · Zasláno: 20. 4. 2015, 11:19:14
juriad:
Zkouším v phpMyAdmin tvůj dotaz, ale pořád mi vrací nuly :/ nevím kde je problém, zkoušel jsem ho všelijak upravit, ale bohužel jsem nepřišel na to jak. Pro jistotu posílám i strukturu db: CREATE TABLE IF NOT EXISTS `rezervace` ( `id` int(11) NOT NULL, `od` date NOT NULL, `do` date NOT NULL, `jmeno` varchar(100) COLLATE utf8_czech_ci NOT NULL, `prijmeni` varchar(100) COLLATE utf8_czech_ci NOT NULL, `apartman` int(11) NOT NULL, `telefon` varchar(30) COLLATE utf8_czech_ci NOT NULL, `email` varchar(100) COLLATE utf8_czech_ci NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; -- -- Vypisuji data pro tabulku `rezervace` -- INSERT INTO `rezervace` (`id`, `od`, `do`, `jmeno`, `prijmeni`, `apartman`, `telefon`, `email`) VALUES (1, '2015-04-20', '2015-04-22', 'Jan', 'Zeleny', 1, '723256703', 'a@b.cz'), (2, '2015-04-21', '2015-04-24', 'Jan', 'Novak', 2, '123456788', 'aa@bb.cz'); CREATE TABLE IF NOT EXISTS `apartmany` ( `id` int(11) NOT NULL, `nazev` varchar(50) COLLATE utf8_czech_ci NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; -- -- Vypisuji data pro tabulku `apartmany` -- INSERT INTO `apartmany` (`id`, `nazev`) VALUES (1, 'AP1'), (2, 'AP2'), (3, 'AP2'), (4, 'AP3'); SELECT a.id, a.nazev, COUNT(r.apartman) > 0 AS obsazeny FROM apartmany AS a LEFT JOIN rezervace AS r ON a.id = r.apartman AND r.od <= '2015-04-21' AND r.do >= '2015-04-26' GROUP BY a.id Chtěl bych se omluvit adminům, že jsem nepoužil fórum na databáze. Myslel jsem, že se to bude řešit v PHP... |
||
juriad Profil |
urquell:
To proto, že máš chybu v JOINovací podmínce (já ji měl správně): AND r.od < '2015-04-26' AND r.do > '2015-04-21' „Lze na to také nahlížet jako na „rezervace se nepřekrývají (začíná později, nebo končí dříve)“: r.od >= $end OR r.do <= $start a to pak znegovat.“ |
||
Taps Profil |
#9 · Zasláno: 20. 4. 2015, 11:38:58
urquell:
Je to celkem logické, že se ti vypisují nuly, protože žádný datum (r.do) není větší jak 2015-04-26 |
||
urquell Profil * |
#10 · Zasláno: 20. 4. 2015, 12:24:46
Jo jasny, jsem to přehlídl xD ... Díky moc všem...
|
||
Časová prodleva: 9 let
|
0