Autor Zpráva
Kateřina
Profil *
Nevítě, proč mě to vypisuje tuhle chybu?

SELECT * FROM hotel ORDER BY rand() LIMIT 0,10
MySQL error: Incorrect key file for table '/tmp/#sql_69f_0.MYI'; try to repair it
Dero
Profil
Zkuste tabulku opravit:

REPAIR TABLE hotel
Kateřina
Profil *
Pomohlo, díky moc.

Ještě bych se chtěla zeptat. V databázi u hotelů mám i GPS (latitude a longitude) ve tvaru: 43.368493000000 a -8.408942000000

Jak mohu vypsat nebližší hotely k daným souřadnicím a vypsat si jen 5 hotelů (LIMIT 0,5).
Dero
Profil
Můžete využít vzorce haversine, který propaguje například Google u svých mapových produktů:

SELECT sirka, delka, 6371 * ACOS(
  COS(RADIANS(_zdrojova_sirka_))
  * COS(RADIANS(sirka))
  * COS(RADIANS(delka)
    - RADIANS(_zdrojova_delka_)
  )
  + SIN(RADIANS(_zdrojova_sirka_))
  * SIN(RADIANS(sirka))
) AS vzdalenost FROM hotel ORDER BY vzdalenost ASC LIMIT 5;


Vzdálenost bude v kilometrech, proměnné _zdrojova_sirka_ a _zdrojova_delka_ značí souřadnice referenčního bodu, od nějž se má vzdálenost počítat.

Zdroj k prostudování: http://code.google.com/apis/maps/articles/phpsqlsearch.html
Kateřina
Profil *
Aha, tak že _zdrojova_sirka_ a delka musi vycházet z údajů 43.368493000000 a -8.408942000000

Jakým způsobem mohu převéct 43.368493000000 a -8.408942000000 na hodnoty 43 a -8, abych doplnila tu _zdrojova_sirka_ a _zdrojova_delka_

Do šířku a délku doplním přímo GPS, tj. 43.368493000000 a -8.408942000000
Dero
Profil
Nemusíte hodnoty převádět na celá čísla, dokonce byste ani neměla - kvůli přesnosti.

Tento zápis bude krásně fungovat, všimněte si dosazení:

SELECT sirka, delka, 6371 * ACOS(
  COS(RADIANS(43.368493))
  * COS(RADIANS(sirka))
  * COS(RADIANS(delka)
    - RADIANS(-8.408942)
  )
  + SIN(RADIANS(43.368493))
  * SIN(RADIANS(sirka))
) AS vzdalenost FROM hotel ORDER BY vzdalenost ASC LIMIT 5;

Pokud máte v databázi sloupce sirka a delka typu VARCHAR, možná bude třeba nutné je před zpracováním funkcí RADIANS přetypovat na desetinné číslo pomocí:

CAST(sirka as DOUBLE)
Kateřina
Profil *
No mám tam VARCHAR. Ten CAST(sirka as DOUBLE) mám umístit kam?
Alphard
Profil
Kateřina:
Podobných vzorců existuje větší množství. Jestli nechcete ve všech dotazech kopírovat tuhle hrůzu, lze definovat vlastní funkci, je uvedena např. v http://php.vrana.cz/vzdalenost-dvou-zemepisnych-bodu.php#d-10110.
Pokud jde o přetypování, musíte ho použít před dosazením hodnot do matematických funkcí, tedy jako parametr vložit další funkci. Ovšem nevidím žádný důvod ukládat to jako varchar, doporučuji změnit typ sloupce na double.
Dero
Profil
SELECT sirka, delka, 6371 * ACOS(
  COS(RADIANS(43.368493))
  * COS(RADIANS(CAST(sirka as DOUBLE)))
  * COS(RADIANS(CAST(delka as DOUBLE))
    - RADIANS(-8.408942)
  )
  + SIN(RADIANS(43.368493))
  * SIN(RADIANS(CAST(sirka as DOUBLE)))
) AS vzdalenost FROM hotel ORDER BY vzdalenost ASC LIMIT 5;


Tohle by měl být funkční kód. Věnujte však prosím pozornost poznámkám, které Vám napsal Alphard, plně s ním souhlasím.
Kateřina
Profil *
No já bohužel do mySQL zasahovat nemůžu. Jsou tam data, která se nemohou měnit, tak že musím vycházet z toho, co již v mySQL je, přesněji ... nelze přidávat řádky apod. :( Zkusím script od Dero.
Kateřina
Profil *
Tak bohužel se naskytla v mySQL dotazu chybička a moc tomu nerozumím :( Radši posílám přímo sem. Vše jsem ale vyplnila dobře.

SELECT *, 6371 * ACOS(COS(RADIANS(41.149992000000)) * COS(RADIANS(CAST(latitude as DOUBLE))) * COS(RADIANS(CAST(longitude as DOUBLE)) - RADIANS(-8.614381000000)) + SIN(RADIANS(41.149992000000)) * SIN(RADIANS(CAST(latitude as DOUBLE)))) AS vzdalenost FROM hotel ORDER BY vzdalenost ASC LIMIT 5;
MySQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DOUBLE))) * COS(RADIANS(CAST(longitude as DOUBLE)) - RADIANS(-8.614381000000)) +' at line 1
Dero
Profil
Použijte ten můj předchozí kód bez CASTů, stroj MySQL si převede řetězec na číslo automaticky. Neuvědomil jsem si, že při přetypování (CAST) nelze specifikovat DOUBLE jako výstupní typ.
Kateřina
Profil *
Ta vzdálenost je vyjádřena v mílích nebo v kilometrech?
Dero
Profil
V kilometrech.

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