Autor | Zpráva | ||
---|---|---|---|
igid26 Profil |
#1 · Zasláno: 13. 11. 2018, 19:07:05
Zdravím všetkých,
snažím sa urobiť vyhľadávací formulár pomocou ktoré sa budú vyhľadávať dáta v databáze. Pomocou formuláru sa budú vyhľadávať volné dátumy ubytovania a v určitej vzdialenosti od zadaného bodu, takže polia pre vyhľadávací dopyt budú nasledovné: - názov - poloha - dištanc (okruh vzdialenosti) - dátum od - dátum do Môj PHP kód: $latitude = '49.2194498; $longitude = '18.7408001'; $nazov_ubytovania = $_GET["nazov-ubytovania"]; $datum_prichod2 = $_GET["datum-prichodu-ubytovanie"]; $datum_odchod2 = $_GET["datum-odchodu-ubytovanie"]; $vzdialenost = $_GET["vzdialenost"]; if(!empty($datum_prichod2)){ $k = DateTime::createFromFormat('d-m-Y', $datum_prichod2 ); $datum_prichod_final = $k->getTimestamp(); } if(!empty($datum_odchod2)){ $k = DateTime::createFromFormat('d-m-Y', $datum_odchod2 ); $datum_odchod_final = $k->getTimestamp(); } Môj SQL pre vyhľadávanie podľa polohy a dištancu: SELECT SQL_CALC_FOUND_ROWS ID, post_title, ( '3959' * acos( cos( radians($latitude) ) * cos(radians( latitude.meta_value ) ) * cos( radians( longitude.meta_value ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude.meta_value ) ) ) ) AS distance FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) INNER JOIN wp_postmeta AS latitude ON wp_posts.ID = latitude.post_id INNER JOIN wp_postmeta AS longitude ON wp_posts.ID = longitude.post_id WHERE wp_posts.post_type = 'hotel' AND latitude.meta_key='listing_map_location_latitude' AND longitude.meta_key='listing_map_location_longitude' GROUP BY wp_posts.ID HAVING distance <= '$vzdialenost' ORDER BY distance ASC Môj SQL pre vyhľadávanie podľa rozpätí dátumov: SELECT * FROM wp_posts WHERE ID NOT IN (SELECT DISTINCT IdClanku FROM rezervacie WHERE Prichod BETWEEN '$datum_prichod_final' AND '$datum_odchod_final' OR Odchod BETWEEN '$datum_prichod_final' AND '$datum_odchod_final') and post_type = 'hotel' Ja by som potreboval spojiť tie dva SQL kódy do jedného. SQL som našiel na nete a upravil som ich. Samostatne fungujú skvele, ale nedarí sa mi ich spojiť, tak aby fungovali správne. |
||
Kajman Profil |
#2 · Zasláno: 13. 11. 2018, 19:18:57
Jakýkoliv řádek v tabulce rezervace vždy blokuje celý hotel na dané období?
|
||
igid26 Profil |
#3 · Zasláno: 14. 11. 2018, 12:57:12
Kajman:
Áno, pokiaľ sa Prichod a Odchod nachádza v rozpätí dátumov. |
||
Kajman Profil |
igid26:
„Áno, pokiaľ sa Prichod a Odchod nachádza v rozpätí dátumov.“ Přijde mi, že Prichod a Odchod by neměl být ani kolem zadaného data, tak jsem tuto variantu zahrnul níže. Možná něco takového... SELECT v.* FROM (SELECT p.id, p.post_title, ( '3959' * Acos(Cos(Radians($latitude)) * Cos(Radians(latitude.meta_value)) * Cos( Radians(longitude.meta_value) - Radians($longitude)) + Sin(Radians($latitude)) * Sin(Radians(latitude.meta_value) )) ) AS distance FROM wp_posts p LEFT JOIN rezervacie r ON p.id = r.idclanku AND r.prichod < '$datum_odchod_final' AND r.odchod > '$datum_prichod_final' INNER JOIN wp_postmeta AS latitude ON p.id = latitude.post_id AND latitude.meta_key = 'listing_map_location_latitude' INNER JOIN wp_postmeta AS longitude ON p.id = longitude.post_id AND longitude.meta_key = 'listing_map_location_longitude' WHERE p.post_type = 'hotel' AND r.idclanku IS NULL) v WHERE v.distance <= '$vzdialenost' ORDER BY v.distance ASC Ale to vyhledávání dle vzdálenosti bude asi hodně pomalé. Vzhledem k tomu, že souřadnice ukládáte jako dvojici stringů se s tím v současné době asi moc nenadělá. V mysql existují spatial datové typy a indexy, s těmi by to mělo být svižnější. |
||
igid26 Profil |
#5 · Zasláno: 14. 11. 2018, 16:30:00
Zdravím, Kajman,
ďakujem za pomoc, ale SQL hlási chybu: #1248 - Every derived table must have its own alias |
||
Kajman Profil |
#6 · Zasláno: 14. 11. 2018, 16:42:02
Přidáno do [#4]. Je to jen takový nástřel, jak by to mohlo vypadat, nezkoušel jsem to.
|
||
igid26 Profil |
#7 · Zasláno: 15. 11. 2018, 08:09:08
Kajman: funguje skvele :) Veľká vďaka.
|
||
Časová prodleva: 5 let
|
0