Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kyselyt kahdesta eri taulusta

Sivun loppuun

jarspa [20.10.2008 21:42:32]

#

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>";

Metabolix [20.10.2008 21:51:44]

#

SELECT * FROM tuotteet LEFT JOIN hylly ON hylly.koodi = tuotteet.koodi;

koodinimikekoodinimikesaldo
1porkkana1porkkana (H)2
2perunaNULLNULLNULL
3lanttu3lanttu (H)6

NULL-arvot voit itse muuttaa nolliksi.

Mitä varten nimike on molemmissa tauluissa?

Antti Laaksonen [20.10.2008 21:59:23]

#

Funktiosta IFNULL voi myös olla hyötyä:

SELECT tuotteet.koodi, IFNULL(hylly.saldo, 0) ...

Grez [20.10.2008 22:04:16]

#

Ja sitten jos kanta on muu kuin MySQL niin COALESCE(hylly.saldo,0).. Toimii tosin myös MySQL:ssä.

jarspa [20.10.2008 22:16:05]

#

Metabolix kirjoitti:



Mitä varten nimike on molemmissa tauluissa?[/t]!

No ei sitä nimikettä tarvii kyl olla siinä hylly-taulussa...

Paljon kiitoksia kaikille! Nyt pelittää.

jarspa [21.10.2008 12:02:34]

#

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

Antti Laaksonen [21.10.2008 12:25:47]

#

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

jarspa [21.10.2008 14:18:42]

#

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)

Grez [21.10.2008 14:31:07]

#

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 ....

Metabolix [21.10.2008 14:45:10]

#

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".

Grez [21.10.2008 14:55:19]

#

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ä.

jarspa [22.10.2008 09:13:48]

#

Kiitos!!

Kyllä on helppoo kun osaa... ja mä vasta opettelen.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta