Moro!
Voisiko joku vähän jelppiä? Olen tehnyt kyselyä kahdesta eri taulusta jotka poikkeavat toisistaan.
Eli, mulla on kaksi eri taulua:
tuotteet-taulu
(koodi)(nimike)
hylly-taulu
(koodi)(nimike)(saldo)
Nyt pitäisi saada lista jossa on tuotteet taulun kaikki rivit ja siten että tulostus hakee hylly-taulusta saldot näille tuotteille. Ongelma on nyt se että alla oleva kysely toimii mutta hakee vain jos noista kahdesta taulusta löytyy sama koodi. Hylly taulussa ei välttämättä ole täysin samoja tuotteita ja näiden saldot tulisi tulostua nollaksi.
$haku=mysql_query("SELECT T.koodi,H.saldo FROM hylly H, tuotteet T WHERE T.koodi=H.koodi"); echo "<table border=1>"; echo "<tr><td width=\"200\"><b>Tuotenumero</b></td><td><b>Saldo</b></td></tr>"; for ($i = 0; $i < mysql_num_rows($haku); $i++) { $koodi = mysql_result($haku, $i, "T.koodi"); $maara = mysql_result($haku, $i, "H.saldo"); echo "<tr> <td width=\"200\">$koodi</td> <td>$maara</td></tr>"; } echo "</table>";
SELECT * FROM tuotteet LEFT JOIN hylly ON hylly.koodi = tuotteet.koodi;
koodi | nimike | koodi | nimike | saldo |
---|---|---|---|---|
1 | porkkana | 1 | porkkana (H) | 2 |
2 | peruna | NULL | NULL | NULL |
3 | lanttu | 3 | lanttu (H) | 6 |
NULL-arvot voit itse muuttaa nolliksi.
Mitä varten nimike on molemmissa tauluissa?
Funktiosta IFNULL voi myös olla hyötyä:
SELECT tuotteet.koodi, IFNULL(hylly.saldo, 0) ...
Ja sitten jos kanta on muu kuin MySQL niin COALESCE(hylly.saldo,0).. Toimii tosin myös MySQL:ssä.
Metabolix kirjoitti:
Mitä varten nimike on molemmissa tauluissa?[/t]!
No ei sitä nimikettä tarvii kyl olla siinä hylly-taulussa...
Paljon kiitoksia kaikille! Nyt pelittää.
Miten voin laskea samoilla tuotenumeroilla olevien tuotteiden saldot yhteen?
Nyt tulostuu monta riviä joissa on monessa eri paikassa samalla tuotenumerolla olevia saldoja. Olisiko hyviä ideoita?
esim. taulusta joka nyt tulostuu...
koodi saldo
52244544 30
54545455 100
55477877 210
52244544 30
54545455 100
55477877 210
Niinkuin huomaatte että siellä on sama tuote eri rivillä ja nämä pitäisi saada yhteen laskettua.
eli sen pitäisi näyttää tältä:
koodi saldo
52244544 50
54545455 200
55477877 420
Ratkaisu on tulostaulun ryhmittely:
SELECT tuotteet.koodi, IFNULL(SUM(hylly.saldo), 0) FROM tuotteet LEFT JOIN hylly ON tuotteet.koodi = hylly.koodi GROUP BY tuotteet.koodi
Tämä ei ainakaan vielä toimi niin kuin pitäisi. Olen yrittänyt työntää sitä SUM funktioo joka väliin mutta ei niin ei :)
$haku=mysql_query("SELECT * FROM tuotteet LEFT JOIN hyllyn_sisalto ON hyllyn_sisalto.tuote_koodi = tuotteet.koodi WHERE tuotteet.asiakas_koodi='kc' GROUP BY tuotteet.koodi ORDER BY tuotteet.koodi ASC"); //IFNULL(SUM(hyllyn_sisalto.maara),0)
Sinun pitäisi kertoa mitkä kentät haluat tuon * tilalla. MySQL:ssä muistaakseni oletuksena autogroupataan kaikki kentät, joilla ei ole kokoumafunktiota. Joten todennäköisesti, ainakin jos GROUP BY ei ole määritelty. Eli joko tuossa tulee group by:hyn ylimääräisiä kenttiä tai sitten kysely kaatuu kun haluat kenttiä joita ei ole group by:ssä eikä kokoumafunktiona.
Eli: SELECT koodi, IFNULL(SUM(hyllyn_sisalto.maara),0) FROM ....
jarspa kirjoitti:
Olen yrittänyt työntää sitä SUM funktioo joka väliin mutta ei niin ei :)
No mikset laita sitä siihen väliin, mihin Antti neuvoi? Kyllä se siinä toimii. Jos * on aivan välttämätön, voit tehdä vaikka näin:
SELECT *, SUM(IFNULL(hylly.maara, 0)) AS 'maara_yhteensa' FROM tuotteet LEFT JOIN hylly ON hylly.koodi = tuotteet.koodi GROUP BY tuotteet.koodi;
Kun ryhmittely yhdistää useita rivejä, kentän arvoksi jää viimeisen löytyneen rivin arvo. Esimerkiksi seuraavassa esimerkissä sarake "maara" sisältää viimeisimmän hylly-rivin tuotemäärän ja "maara_yhteensa" summan. Taulukko on tuotettu ylläolevalla tietokantakyselyllä.
+-------+----------+-------+-------+----------------+ | koodi | nimike | koodi | maara | maara_yhteensa | +-------+----------+-------+-------+----------------+ | 1 | peruna | 1 | 10 | 11 | | 2 | porkkana | NULL | NULL | 0 | | 3 | lanttu | 3 | 3 | 33 | +-------+----------+-------+-------+----------------+
Tässä tilanteessa kuitenkin olisi järkevää valita vain kentät "tuotteet.koodi", "tuotteet.nimike" ja "maara_yhteensa".
Ok, muistin näköjään väärin, miten se hanskaa noi ylimääräiset kentät.. Joissakin muissa tietokannoissa tulee vaan virheilmoitus jos pyynnössä on kenttiä joita ei ole group by:ssä eikä kokoumafunktiona. Siksi en pitäisi *:ä kokoumakyselyssä välttämättä suositeltavana käytäntönä MySQL:ssäkään, vaikka se salliikin tuollaisen laiskottelun. Ainakaan jos niitä ylimääräisiä kenttiä ei kuitenkaan käytä.
Kiitos!!
Kyllä on helppoo kun osaa... ja mä vasta opettelen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.