Autor | Zpráva | ||
---|---|---|---|
Kateřina Profil * |
#1 · Zasláno: 19. 7. 2011, 16:57:08
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 |
#2 · Zasláno: 19. 7. 2011, 17:22:26 · Upravil/a: Dero
Zkuste tabulku opravit:
REPAIR TABLE hotel |
||
Kateřina Profil * |
#3 · Zasláno: 19. 7. 2011, 18:02:25
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 |
#4 · Zasláno: 19. 7. 2011, 18:48:31 · Upravil/a: Dero
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 * |
#5 · Zasláno: 19. 7. 2011, 19:09:37
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 |
#6 · Zasláno: 19. 7. 2011, 19:20:56
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 * |
#7 · Zasláno: 19. 7. 2011, 19:40:36
No mám tam VARCHAR. Ten CAST(sirka as DOUBLE) mám umístit kam?
|
||
Alphard Profil |
#8 · Zasláno: 19. 7. 2011, 19:51:42
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 |
#9 · Zasláno: 19. 7. 2011, 19:53:10
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 * |
#10 · Zasláno: 19. 7. 2011, 20:02:45
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 * |
#11 · Zasláno: 19. 7. 2011, 20:26:22
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 |
#12 · Zasláno: 19. 7. 2011, 20:36:31
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 * |
#13 · Zasláno: 19. 7. 2011, 20:50:40
Ta vzdálenost je vyjádřena v mílích nebo v kilometrech?
|
||
Dero Profil |
#14 · Zasláno: 19. 7. 2011, 20:51:14
V kilometrech.
|
||
Časová prodleva: 13 let
|
0