Autor | Zpráva | ||
---|---|---|---|
mersi Profil |
Potrebujem vyselektovať dostupné izby (dostupnosť je podmienená dátumom v ubytovanie.cas_odchodu) Moderátor Kajman: Titulek „spojenie 3 tabuliek cez cudzí kľúč“ nevystihuje podstatu dotazu. Příště zkuste prosím vymyslet lepší.
|
||
Kajman_ Profil * |
#2 · Zasláno: 29. 11. 2011, 18:30:06
Zkuste left joinem připojit kolize uložených ubytování s chtěným termínem. Pak stačí jen vypsat pokoje, kde se žádná kolize nenajde (where id_ubytovanie is null).
Viz. podobné téma. |
||
mersi Profil |
#3 · Zasláno: 29. 11. 2011, 19:11:31 · Upravil/a: mersi
ospravedlňujem sa Vám, vysvetlím to podrobnejšie, ak je ubytovanie.cas_odchodu = '0000-00-00 00:00:00' znamená to, že izba (pridelená tomuto ubytovaniu cez spojovaciu tabulku) je nedostupná (ešte obsadená, zákazník neodišiel) ak je dostupná je tam nejaký datetime uložený
potreboval by som selektovať všetky izby, ktoré nemajú ani raz cez spojovaciu tabuľku pridelené ubytovanie s cas_odchodu = '0000-00-00 00:00:00' alebo ak toto spojenie vrati NULL t.j. este nebola izba pridelená ubytovaniu |
||
mersi Profil |
#4 · Zasláno: 29. 11. 2011, 20:57:18
lenže neviem to ako na to spraviť selekt, skúšal som takto:
SELECT i. * , u . * FROM izby AS i LEFT JOIN izba_ubytovanie AS iu ON iu.id_izba = i.id_izba LEFT JOIN ubytovania AS u ON u.id_ubytovanie = iu.id_ubytovanie WHERE u.cas_odchodu IS NULL OR u.cas_odchodu != '0000-00-00 00:00:00' to mi však vráti aj nedostupné izby, ktoré už raz mali nastavený iný datetime ako je '0000-00-00 00:00:00' (t.j že už boli raz obsadené) |
||
Kajman_ Profil * |
#5 · Zasláno: 29. 11. 2011, 22:03:04
Proč to neděláte podle rady v příspěvku [#2]? Tedy do ON dát prodmínky, kdy to koliduje a do where dát u.id_ubytovanie is null. Podívejte se na ten odkaz, tam to je také tak řešené!
|
||
mersi Profil |
#6 · Zasláno: 29. 11. 2011, 23:03:03 · Upravil/a: mersi
no skusil som toto, ale asi tomu nechápem lebo mi to nevrátilo neočakávané objekty
SELECT i . * , u . * FROM izby AS i LEFT JOIN izba_ubytovanie AS i_u ON i_u.id_izba = i.id_izba LEFT JOIN ubytovania AS u ON u.id_ubytovanie = i_u.id_ubytovanie AND u.cas_odchodu != '0000-00-00 00:00:00' WHERE u.id_ubytovanie IS NULL |
||
mersi Profil |
#7 · Zasláno: 29. 11. 2011, 23:18:07 · Upravil/a: mersi
mám takéto tabuľky a výsledok by nemal vrátiť v podstate nič, lebo izby sú priradené aj ubytovaniu, ktoré ešte neskončilo (cas_odchodu = '0000-00-00 00:00:00') |
||
Kajman_ Profil * |
#8 · Zasláno: 30. 11. 2011, 00:52:31
Tak ještě jednou... do left joinu máte dávat kolizní, tedy
u.cas_odchodu = '0000-00-00 00:00:00' |
||
mersi Profil |
#9 · Zasláno: 30. 11. 2011, 16:02:53
SELECT i. * , u. * FROM izby AS i LEFT JOIN izba_ubytovanie AS i_u ON i_u.id_izba = i.id_izba LEFT JOIN ubytovania AS u ON u.id_ubytovanie = i_u.id_ubytovanie AND u.cas_odchodu = '0000-00-00 00:00:00' WHERE u.id_ubytovanie IS NULL nerieši to problém |
||
Kajman_ Profil * |
#10 · Zasláno: 30. 11. 2011, 16:38:19
Aha, on tam nesmí být left join mezi druhou a třetí tabulkou, bude to potřeba dobře ozávorkovat...
SELECT i.* FROM izby AS i LEFT JOIN (izba_ubytovanie AS i_u JOIN ubytovania AS u ON u.id_ubytovanie = i_u.id_ubytovanie AND u.cas_odchodu = '0000-00-00 00:00:00') ON i_u.id_izba = i.id_izba WHERE u.id_ubytovanie IS NULL |
||
mersi Profil |
#11 · Zasláno: 30. 11. 2011, 18:39:29
ďakujem veľmi pekne
masaker, musím si viac naštudovať spájanie tabuliek, aby som tomu rozumel |
||
Časová prodleva: 12 let
|
0