21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
urquell
Profil *
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
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
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
ověří, jestli je celý termín volný, nebo ne.
urquell
Profil *
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 *
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 *
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');
SQL dotaz, který testuji:
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'
Mají tam být striktní nerovnosti a přehozený konec a začátek. Proč tomu tak je:
„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
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 *
Jo jasny, jsem to přehlídl xD ... Díky moc všem...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0