Autor Zpráva
Sajitko
Profil
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
SET @query=CONCAT("SELECT ... WHERE ", podminka, " AND idobjektu ..."); 

PREPARE muj_dotaz FROM @query;
EXECUTE muj_dotaz;
DEALLOCATE PREPARE muj_dotaz; 
Sajitko
Profil
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
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
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.

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