Autor Zpráva
igid26
Profil
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
Jakýkoliv řádek v tabulce rezervace vždy blokuje celý hotel na dané období?
igid26
Profil
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
Zdravím, Kajman,
ďakujem za pomoc, ale SQL hlási chybu:
#1248 - Every derived table must have its own alias
Kajman
Profil
Přidáno do [#4]. Je to jen takový nástřel, jak by to mohlo vypadat, nezkoušel jsem to.
igid26
Profil
Kajman: funguje skvele :) Veľká vďaka.

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