- Többszörösen összetett SQL lekérdezés. Ez a néhány sor 2-3 nehéz órámba került. nevet Aki hasonló probléma megoldásán fáradozik, annak sokat segít. - Program mûködése: csak abban az esetben tudja az illetõ felvenni a…
- Többszörösen összetett SQL lekérdezés. Ez a néhány sor 2-3 nehéz órámba került. nevet Aki hasonló probléma megoldásán fáradozik, annak sokat segít.
- Program mûködése: csak abban az esetben tudja az illetõ felvenni a $_POST tárgyat, ha ötösre teljesítette azt (ETR-es rendszerekhez hasonló, csak ott ez 2-es). Tegnap kipróbáltam különbözõ kezdeti feltételekkel (közben kiderültek a hibák és azok javítva lettek) és végül hiba nélkül futott. Ha a tárgyhoz nem tartozik elõfeltétel, az illetõ gond nélkül felveszi és így lefut az update parancs is, hiszen a többszörösen összetett select utasítás IF vezérlési szerkezete automatikusan 1-et ad eredményül.
- Az sql parancs nyilván nem kerül a kukába, hanem alap,közép,emeltszintû fórumjog megszerzéséhez irányuló vizsgatárgyak felvételét teszi majd lehetõvé. Aki ötösre teljesíti az alapszintet, az fórumjogot szerez, ezzel megvan az elõfeltétel és föl tudja venni a közép, majd az emeltszintû tárgyakat (ezeket nem kötelezõ felvenni, bár a stréberebbeknek ajánlott, hiszen a fórumjog nem vész el, ha azok már nem sikerülnek nevet ).
PHP-MYSQL programkód:
$sql = "UPDATE kurzustabla SET KRT_JELENTK=CONCAT(KRT_JELENTK,'"._US_ID_."|') WHERE KRT_ID='".$_POST."' AND (SELECT IF((SELECT 'OK' FROM exam WHERE (SELECT TRG_ELOFELT FROM targylist WHERE TRG_KOD='".$_POST."' limit 1) LIKE CONCAT('%',EX_TRG_KOD,'%') AND EX_TELJESIT LIKE '%."._US_ID_."||5%' limit 1)='OK' OR (SELECT TRG_ELOFELT FROM targylist WHERE TRG_KOD='".$_POST."' limit 1)='',1,0)) = 1";
if(!mysql_query($sql)) {print mysql_error(); }
elseif(mysql_affected_rows()!=1) { print $_POST." kurzus felvétele sikertelen hiányzó elõfeltétel miatt!";}
else { print $_POST." kurzus felvétele sikeres!";}
? >
Az sql-t érdemesebb sprintf-el összerakni, sokkal olvashatóbb lesz a kód és nem lesz 4 aposztróf/idézõjel/backslash egymás mellett szerencsétlen esetben.
Továbbá a like,or és limit kulcsszavak használata többszörösére növeli a futásidõt, bár nem mindig elkerülhetõek, illetve az adatbázis tervezési hibáiból adódóan nincs más út olykor.
Az or architekturális okok miatt lassú, a like azért mert string trükkökkel keres, a limit pedig azért mert mindig rendezi a recordsetet, bár ezek egy részét felteszem megfelelõ indexekkel felgyorsítottad.
Egyszerûbb lehet join/having/min/max függvényeket futtatni.
Nem tudom ellenõrizni, nincs itt mysql, de egy próbát ez is megérhet:
UPDATE kurzustabla
SET KRT_JELENTK=CONCAT(KRT_JELENTK,"._US_ID_."|)
WHERE KRT_ID=".$_POST."
AND exists (
SELECT distinct OK
as result,
as TRG_ELOFELT
FROM exam inner join targylist on TRG_ELOFELT like CONCAT(%,EX_TRG_KOD,%) where TRG_KOD=".$_POST."
AND EX_TELJESIT LIKE %."._US_ID_."||5%
union
SELECT OK
as result, TRG_ELOFELT FROM targylist WHERE TRG_KOD=".$_POST."
)
A like helyett itt még gyorsabb lehet a LEFT, RIGHT sql függvény is, ha fix helyen van mindig az érdemjegy, ha jól látom, akkor a RIGHT(EX_TELJESIT,1) mûködhet.