MySQL - Zeile gruppiert und einzeln ausgeben
.Plip.
- datenbank
1 Matthias Apsel0 DiBo330 .Plip.0 Vinzenz Mai0 DiBo33
Hi,
ich habe eine MySQL-Datenbank mit mehreren Artikeln. Jeder Artikel kann mehrmals mit derselben Artikelnummer, aber unterschiedlichen Eigenschaften vorhanden sein:
DB:
Artikel_ID | Eigenschaft_1 | Eigenschaft_2 | Eintrag
----------------------------------------------------
1 | 1 | 10 | 1
1 | 3 | 12 | 2
1 | 2 | 17 | 3
2 | 4 | 7 | 1
2 | 3 | 2 | 2
2 | 2 | 6 | 3
Jetzt möchte ich jeden Artikel einmal mit den Mittelwerten der Eigenschaften ausgeben, aber auch jeden individuellen Eintrag einzeln. So sollte das dann aussehen:
Ausgabe:
Artikel_ID | Eigenschaft_1 | Eigenschaft_2
------------------------------------------
1 | 2 | 13 // Mittelwert
1-1 | 1 | 10
1-2 | 3 | 12
1-3 | 2 | 17
2 | 3 | 5 // Mittelwert
2-1 | 4 | 7
2-2 | 3 | 2
2-3 | 2 | 6
Geht das mit 1 SELECT oder muss ich das mit einem 2. SELECT innerhalb der ersten Ausgabe machen?
"SELECT artikel, AVG(e1), AVG(e2) ... GROUP BY artikel_id"; {
echo artikel, e1, e2;
"SELECT e1, e2 ... WHERE artikel_id = artikel"; {
echo artikel, e1, e1;
}
}
Om nah hoo pez nyeetz, .Plip.!
ich habe eine MySQL-Datenbank mit mehreren Artikeln. Jeder Artikel kann mehrmals mit derselben Artikelnummer, aber unterschiedlichen Eigenschaften vorhanden sein:
Dann solltest du nicht dieselbe Artikelnummer verwenden und diese schon garnicht in den Rang einer ID erheben.
Außerdem sind es auch vom logischen her zwei verschiedene Anfragen, weil man den Artikel mit den durchschnittlichen Eigenschaften ja nicht kaufen kann.
Matthias
ich habe eine MySQL-Datenbank mit mehreren Artikeln. Jeder Artikel kann mehrmals mit derselben Artikelnummer, aber unterschiedlichen Eigenschaften vorhanden sein:
Dann solltest du nicht dieselbe Artikelnummer verwenden und
Wieso? Ein Artikel (dieselbe Artikelnummer) kann mehrere Variante (Produkte mit unterschiedlichen Produktnummern) haben - es kann also sehrwohl mehrere Produkte mit derselben Artikelnummer geben.
diese schon garnicht in den Rang einer ID erheben.
Ein Artikelnummer kann - wegen der oben genannten eigenart - niemals eine eindeutige Identifikation sein, dafür ist die Produktnummer da.
Noch komplizierter wirds, wenn man SKUs verwendet :)
Om nah hoo pez nyeetz, .Plip.!
Öööh, ja, hallo ]:o
ich habe eine MySQL-Datenbank mit mehreren Artikeln. Jeder Artikel kann mehrmals mit derselben Artikelnummer, aber unterschiedlichen Eigenschaften vorhanden sein:
Dann solltest du nicht dieselbe Artikelnummer verwenden und diese schon garnicht in den Rang einer ID erheben.
Die Artikel_ID ist keine eindeutige ID (die gibt es extra).
Außerdem sind es auch vom logischen her zwei verschiedene Anfragen, weil man den Artikel mit den durchschnittlichen Eigenschaften ja nicht kaufen kann.
Doch könnte man schon, da die Eigenschaften sowas wie kundenspezifische "Bewertungen" sind. Man sieht also, wie der Artikel im Schnitt "bewertet" wurde, aber man soll auch die einzelnen Bewertungen sehen können.
Wenn der Mittelwert jeweils auch am Ende sein kann
[code=sql]
SELECT CONCAT(aid, IF(eintrag IS NULL, '', CONCAT('-', eintrag))) ArtNr
, ROUND(AVG(e1)) ae1
, ROUND(AVG(e2)) ae2
FROM arttab
GROUP BY aid, eintrag
WITH ROLLUP
[/code]
Wenn der Mittelwert jeweils auch am Ende sein kann
SELECT CONCAT(aid, IF(eintrag IS NULL, '', CONCAT('-', eintrag))) ArtNr
, ROUND(AVG(e1)) ae1
, ROUND(AVG(e2)) ae2
FROM arttab
GROUP BY aid, eintrag
WITH ROLLUP
>
Danke, aber das geht leider nicht :-(
Hallo,
Wenn der Mittelwert jeweils auch am Ende sein kann
Danke, aber das geht leider nicht :-(
was heißt "geht nicht"? Könntest Du das näher erläutern?
Wenn die Abfrage (weitgehend) die von Dir gewünschten Daten liefert, dann setze doch einfach eine Abfrage auf diese Abfrage ab, die die Daten wie von Dir gewünscht umsortiert. Performancewunder darfst Du dabei nicht erwarten.
Falls die Performance beim Subselect ein Problem darstellt, bei der angegebenen Abfrage jedoch nicht und die Daten prinzipiell (bis auf die Reihenfolge und ein, zwei Kleinigkeiten) richtig sind, dann ändere einfach Deine Ausgaberoutine, so dass diese den ersten Datensatz einer Gruppe als letzten Datensatz der Gruppe ausgibt. Technik "Gruppenwechsel".
Freundliche Grüße
Vinzenz
Danke, aber das geht leider nicht :-(
Tja, son Pech würde ich da sagen zumal es bei meinem MySQL "geht".
Aber du könntest ja auch mal sagen: was genau "nicht geht"
Danke, aber das geht leider nicht :-(
Tja, son Pech würde ich da sagen zumal es bei meinem MySQL "geht".
Aber du könntest ja auch mal sagen: was genau "nicht geht"
Mit geht nicht meinte ich nicht, dass dein Code nicht funktioniert, sondern dass
Wenn der Mittelwert jeweils auch am Ende sein kann
mir nicht hilft. Ich brauche zuerst den Mittelwert und dann die Einzelergebnisse.
Mit geht nicht meinte ich nicht, dass dein Code nicht funktioniert, sondern dass
Wenn der Mittelwert jeweils auch am Ende sein kann
mir nicht hilft. Ich brauche zuerst den Mittelwert und dann die Einzelergebnisse.
Ja mein Gott, dann mach halt was Vinzent vorgeschlagen hat
[code=sql]
SELECT ArtNr, ae1, ae2
FROM (
SELECT CONCAT(aid, IF(eintrag IS NULL, '', CONCAT('-', eintrag))) ArtNr
, ROUND(AVG(e1)) ae1
, ROUND(AVG(e2)) ae2
FROM arttab
GROUP BY aid, eintrag
WITH ROLLUP
) a
ORDER BY ArtNr
[/code]