| Autor | Zpráva | ||
|---|---|---|---|
| Sajitko Profil |
#1 · Zasláno: 1. 8. 2010, 15:20:08 · Upravil/a: Sajitko
Zdravím,
Volám proceduru: $result = mysqli_query($link, "call pobliz(".$id.", ".$vzdalenost.",' podkategorie = 15 ')"); a potřeboval bych aby třetí parametr byl součástí dotazu: ... WHERE PODMINKA(třetí parametr) AND idobjektu != mybuilding_id .... pokud to zapíšu takto tabulka vždy vrací prázdný výsledek, pokud to zapíšu bez uvozovek mySQL vypíše že podkategorie není sloupec v dané tabulce přičemž obravdu to pole tam je |
||
| TomášK Profil |
#2 · Zasláno: 1. 8. 2010, 15:38:42
SET @query=CONCAT("SELECT ... WHERE ", podminka, " AND idobjektu ...");
PREPARE muj_dotaz FROM @query;
EXECUTE muj_dotaz;
DEALLOCATE PREPARE muj_dotaz; |
||
| Sajitko Profil |
#3 · Zasláno: 1. 8. 2010, 15:52:07 · Upravil/a: Sajitko
TomášK:
takhle bych to chápal, ale potřeboval bych to zapasovat sem: třetí parametr z volání procedury by měl doplnit dotaz procedury o podminky VOLANI Z PHP: $result = mysqli_query($link, "call gps_pobliz(".$id.", ".$vzdalenost.", ".$where.")"); PROCEDURA: DROP PROCEDURE `gps_pobliz`// CREATE DEFINER=`localhost`@`%` PROCEDURE `gps_pobliz`(mybuilding_id int, mydistance int, podminka text) BEGIN declare mylon double; declare mylat double; declare mytyp int; declare lon1 float; declare lon2 float; declare lat1 float; declare lat2 float; SELECT sirka, delka, typ INTO mylat, mylon, mytyp FROM objekty WHERE idobjektu = mybuilding_id; SET lon1 = mylon-mydistance/abs(cos(radians(mylat))*111); SET lon2 = mylon+mydistance/abs(cos(radians(mylat))*111); SET lat1 = mylat-(mydistance/111); SET lat2 = mylat+(mydistance/111); SELECT objekty.idobjektu, 6372.795 * 2 * ASIN(SQRT(POWER(SIN((mylat-ABS(sirka))*pi()/180/2), 2) + COS(mylat * pi()/180) * COS(ABS(sirka) * pi()/180) * POWER(SIN((mylon - delka) * pi()/180 / 2), 2))) AS distance FROM objekty WHERE podminka AND idobjektu != mybuilding_id AND typ != mytyp AND sirka IS NOT NULL AND delka IS NOT NULL AND delka BETWEEN lon1 AND lon2 AND sirka BETWEEN lat1 AND lat2 HAVING distance < mydistance ORDER BY distance LIMIT 50; END |
||
| TomášK Profil |
#4 · Zasláno: 1. 8. 2010, 16:11:47
Však to tam jen doplnit :-) Překvapilo mě, že MySQL umí z procedury vracet výsledky SELECTu, umí to už dlouho? Měl jsem pocit, že to nejde.
DROP PROCEDURE `gps_pobliz`// CREATE DEFINER=`localhost`@`%` PROCEDURE `gps_pobliz`(mybuilding_id int, mydistance int, podminka text) BEGIN declare mylon double; declare mylat double; declare mytyp int; declare lon1 float; declare lon2 float; declare lat1 float; declare lat2 float; SELECT sirka, delka, typ INTO mylat, mylon, mytyp FROM objekty WHERE idobjektu = mybuilding_id; SET lon1 = mylon-mydistance/abs(cos(radians(mylat))*111); SET lon2 = mylon+mydistance/abs(cos(radians(mylat))*111); SET lat1 = mylat-(mydistance/111); SET lat2 = mylat+(mydistance/111); SET @q=CONCAT( "SELECT objekty.idobjektu, 6372.795 * 2 * ASIN(SQRT(POWER(SIN((mylat-ABS(sirka))*pi()/180/2), 2) + COS(mylat * pi()/180) * COS(ABS(sirka) * pi()/180) * POWER(SIN((mylon - delka) * pi()/180 / 2), 2))) AS distance FROM objekty WHERE", podminka, " AND idobjektu != mybuilding_id AND typ != mytyp AND sirka IS NOT NULL AND delka IS NOT NULL AND delka BETWEEN lon1 AND lon2 AND sirka BETWEEN lat1 AND lat2 HAVING distance < mydistance ORDER BY distance LIMIT 50" ); PREPARE q FROM @q; EXECUTE q; DEALLOCATE PREPARE q; END Možná je potřeba i doplnit proměnné přímo do vytvářeného selectu, nepamatuju si, jak to funguje:
SET @q=CONCAT(
"SELECT objekty.idobjektu, 6372.795 * 2 * ASIN(SQRT(POWER(SIN((mylat-ABS(sirka))*pi()/180/2), 2) + COS(",
mylat,
"* pi()/180) * COS(ABS(sirka) * pi()/180) * POWER(SIN((",
mylon,
" - delka) * pi()/180 / 2), 2))) AS distance FROM objekty WHERE",
...
);
|
||
| Sajitko Profil |
#5 · Zasláno: 1. 8. 2010, 16:35:40
TomášK:
Super už to funguje moc díky, bylo potřeba doplnit ty proměnné. Procedury jsou pro mě něco nového a obecně nějaké složitější věci v MySQL taky. Tadle procedura neni moje je asi jediná co jsem našel která počítá s GPS souřadnicema v určitém "okruhu" a je dokonce solidně rychlá. Jelikož řešit to v PHP by byla naprostá hloupost musel jsem použít MySQL a tím pádem byla nutna rada. |
||
|
Časová prodleva: 15 let
|
|||
0