MySQL update + join kérdés
Sziasztok!
Meg tudja valaki magyarázni, hogy hogyan működik ez a kód:Én azt várnám, hogy a 12-es rendelés tételeinek bónusz pontját fogja jóvá írni a megrendelő felhasználónak. Ennek ellenére mindig csak az első tétel bónuszpontját írja jóvá a többit nem. Miért?
Köszönöm előre is:
Dávid
■ Meg tudja valaki magyarázni, hogy hogyan működik ez a kód:
UPDATE FELHASZNALO F
JOIN RENDELES R ON R.FELHASZNALO_KOD = F.KOD AND R.KOD = 12
JOIN RENDELES_TETEL RT ON RT.RENDELES_KOD = R.KOD
SET F.BONUSZ = F.BONUSZ + RT.BONUSZ
Köszönöm előre is:
Dávid
szerintem az tortenik, hogy
egy jol sikerult GROUP BY + SUM megoldas lehet a problemadra.
doksiban nem talaltam se pro se kontra emlitest errol, a bugs.mysql.com-on korulnezve egy ilyet talaltam:
http://bugs.mysql.com/bug.php?id=11495
nem tudtak reprodukalni, de csak azert, mert az ottani updatelendo tablaban nem volt olyan rekord, amihez tobb sor tartozott volna a joinolt tablakban.
sql standardot lehetne meg megnezni, hatha ez ott definialt viselkedes, ha jol emlekszem a mysql a SQL:2003 standardot probalja kovetni.
Tyrael
UPDATE helyett először játssz
Nem dokumentált/ismert tulajdonság
Köszönöm a válaszokat!
Tyrael:
Igen, valószínűleg ez történhet, bár engem továbbra is meglep, hogy így működik a motor. Miután - Hozzád hasonlóan - én is csak olyan példákat találtam, ahol 1 sorhoz 1 kapcsolt van, végül én is a GROUP BY + SUM párossal oldottam meg a kérdést.
Gábor:
A SELECT sajnos nem segít, mert ha ezt átírod lekérdezéssé, akkor álomszépen hozza a szükséges sorokat, az UPDATE viszont felhasználónként csak egyszer hajtódik végre.
Üdv:
Dávid
Furcsa. Mindenesetre azt
amig igy van tordelve, ahogy,
Tyrael
Szerintem ez így logikus
Ízlések és pofonok
Tudom, hogy ízlések és pofonok különböznek, de számomra azért nem logikus ez, mert ez a JOIN-os lekérdezés, ami az UPDATE belsejében van, több sort adhat vissza minden felhasználóhoz, az UPDATE pedig - várakozásaim szerint - minden visszaadott sorra el kéne, hogy végezze az értékadást. Ez mindaddig így is van, amíg nincs JOIN, vagy van, de 1:1 kapcsolat van a szülő és a gyerek tábla között. Csak akkor viselkedik így, ha 1:n kapcsolat van közöttük.
Ha szerinted ezzel együtt is logikus így, akkor el tudnád magyarázni? Hátha én is megértem.
Üdv:
Dávid
az UPDATE pedig -
Hétköznapi szöveges példa, ami talán még jobban szemlélteti. Azt a feladatot kapod, hogy: Pisti zsebpénze legyen egyenlő annyival, amennyit az osztálytársai is kapnak. Megnézed sorban, hogy mennyi zsebpénzt kapnak az osztálytársai, ezek különböző összegek. Mivel más utasítást nem kaptál, nem tudod, mi alapján döntsd el, hogy most akkor mennyi is legyen (inkább a kevesebb, vagy inkább a több), hát - az egyszerűség és a legkevesebb energiaráfordítás okán - azt mondod, akkor legyen annyi, mint azé az osztálytársáé, akiét legelőször nézted meg.
És ha a feladatot úgy határozzuk meg, ahogy te az eredeti értékadást (F.BONUSZ = F.BONUSZ + RT.BONUSZ), akkor így szól: Pisti zsebpénzét emeld meg annyival, amennyit az osztálytársai is kapnak. A nehézség ugyanaz, csak itt tudjuk, hogy mennyi volt Pisti eddigi zsebpénze, de az emelés összegére nézve szintén több lehetőségünk van, lásd az előző példa. És egész biztos, hogy nem úgy járnál el, hogy akkor Pisti zsebpénzét annyiszor növelnéd, ahány osztálytársától megkérdezed, hogy ő mennyit kap.
Tehát a lényeg, hogy egy darab értékadás van csak, mert az egyenlőségjel bal oldalán csak egy sor egy mezője áll (F.BONUSZ), míg a jobb oldalán több sor egy-egy mezője (RT.BONUSZ), még akkor is, ha ez egy SELECT-es kiírásban úgy néz ki, hogy minden sorba odaírja az F.BONUSZ értékét. Ebben az esetben a sorok csak értékadási lehetőségeket jelölnek.