Gruppierte Ausgabe über zwei Tabellen

Spelmann

Erfahrenes Mitglied
Hallo ich tue mich schwer mit dem Gruppieren über zwei Tabellen.
Es ist sehr wahrscheinlich, dass das irgendwo schon beschrieben ist, aber was ich gefunden habe wich irgendwie immer von meinem Modell ab und ich konnte es nicht übertragen.

Hier ein einfaches Modell meines Problems:
Tabelle 1 enthält verschiedene Artikel.

Code:
+----------+-------------+
|    ID    |   MATERIAL  | 
+----------|-------------+
|     1    |     Holz    |
|     2    |     Holz    |
|     3    |     Stein   |
|     4    |     Stein   |
|     5    |     Stein   |
|     6    |     Stein   |
|     7    |     Stein   |
|     8    |     Stein   |
|     9    |     Stein   |
|    10    |     Gummi   |
|    11    |     Gummi   |
|    12    |     Gummi   |
+----------+-------------+

Tabelle 2 enthält verschiedene Merkmale aller Artikel aus Tabelle 1

Code:
+----------+-------------+-------------+
|PARENT-ID |   Merkmal   |  Ausprägung |
+----------|-------------+-------------+
|     2    |     Größe   |     klein   |
|     3    |     Form    |     rund    |
|     3    |     Farbe   |     rot     |
|     3    |     Größe   |     klein   |
|     4    |     Form    |     eckig   |
|     4    |     Farbe   |     grün    |
|     4    |     Größe   |     klein   |
|     5    |     Form    |     rund    |
|     5    |     Farbe   |     grün    |
|     5    |     Größe   |     mittel  |
|     6    |     Form    |     oval    |
|     6    |     Farbe   |     gelb    |
|     6    |     Größe   |     groß    |
|     7    |     Form    |     oval    |
|     7    |     Farbe   |     grün    |
|     7    |     Größe   |     klein   |
|     8    |     Form    |     eckig   |
|     8    |     Farbe   |     grün    |
|     8    |     Größe   |     mittel  |
|     9    |     Form    |     eckig   |
|     9    |     Farbe   |     gelb    |
|     8    |     Größe   |     klein   |
+----------+-------------+-------------+

Von den 7 Steinen sind 2 rund, 2 oval und 3 eckig
Ich möchte nach Merkmal->Form gruppieren um am Ende in diesem Beispiel 3 Steine zu erhalten.

Kann mir jemand sagen wie das SQL-Statement dafür aussehen muss?

Vielen Dank!
 
Hi

Die Ausgabe soll also pro vorkommendem Material und vorkommender Form genau eine Zeile sein, unabhängig von der Anzahl (solang es existiert)?

Annahme: (merkmal.parentid,merkmal.merkmal) ist unique.

SQL:
SELECT artikel.material,merkmal.auspraegung FROM artikel,merkmal WHERE merkmal.parentid=artikel.id AND merkmal.merkmal="form" GROUP BY 1,2
oder auch
SQL:
SELECT DISTINCT artikel.material,merkmal.auspraegung FROM artikel,merkmal WHERE merkmal.parentid=artikel.id AND merkmal.merkmal="form"
 
Du bist der Held!
War ein bisschen knifflig das aufs reale Projekt zu übertragen, hab's aber hinbekommen.
Ich danke Dir vielmals.
 
Uups, doch noch eine kleine Falle.
Wenn in der Tabelle Merkmale das Merkmal Form definiert ist, ist wie von Dir angenommen die Beziehung (merkmale.parentid,merkmale.merkmal) unique. Soweit läuft alles perfekt.

Allerdings zeigt sich nun, dass in der Tabelle merkmale das Merkmal Form nicht für alle Datensätze definiert ist. Kann man dafür noch ein Fall-Back einbauen, so dass in diesem Falle nur nach artikel.material gruppiert wird?
 
Moin Spelmann,

dann wird es wohl auf einen LEFT JOIN herauslaufen.
SQL:
select material, Auspraegung,  Count(*) as Anzahl
         FROM (
  SELECT artikel.material
      ,IIF(merkmal.auspraegung is null, ' N/A ', merkmal.auspraegung) as Auspraegung
  FROM artikel,merkmal
     LEFT JOIN MERKMAL ON  merkmal.parentid=artikel.id AND merkmal.merkmal="Form"
) x
     GROUP BY material
          , auspraegung

Ich habe jetzt nichts über dein Datenbanksystem gelesen. Deshalb habe ich willkürlich die "IIF(wenn, dann,sonst)"-Syntax genommen.
Kann sein, dass du es durch ein CASE WHEN wenn THEN dann ELSE sonst END" ersetzen musst.
Soll ja nur eine Skizze sein.

Wenn du keine Anzahl und somit kein GROUP BY brauchst, dann kürzer, aber wahrscheinlich auch nicht schneller
SQL:
  SELECT DISTINCT artikel.material
      ,IIF(merkmal.auspraegung is null, ' N/A ', merkmal.auspraegung) as Auspraegung
  FROM artikel,merkmal
     LEFT JOIN MERKMAL ON  merkmal.parentid=artikel.id AND merkmal.merkmal="Form"



Grüße
Biber
 
Hi Biber,
es war vielleicht keine gute Idee, das Modell so zu reduzieren. Die LEFT JOIN Beispiele konnte ich nicht auf mein Problem übertragen. Ich hatte ohne Ende Syntax-Fehler.

Deswegen würde ich hier gern nochmal den wichtigsten Teilen der beiden Tabellen mit den tatsächlichen Feldbezeichnungen zeigen, dann kann ich die Fehler besser eingrenzen.

Es gibt also zwei Tabellen:
Code:
Tabelle: mm_produktliste
+----------+--------------+--------------+
| INTARTNR |    MODELL    |    PRODUKT   |
| (unique) |              |              |
+----------|--------------+--------------+
|     1    |   Trallala   |     Mädchen  |
|     2    |   Trallala   |     Mädchen  |
|     9    |Schneewittchen|     Herren   |
|    10    |Schneewittchen|     Damen    |
|    11    |Schneewittchen|     Damen    |
|    12    |Schneewittchen|     Damen    |
|    13    |   irgendwas  |     Herren   |
+----------+--------------+--------------+

Tabelle: mm_artikelmerkmale
+-------------+-------------+-------------+
|PARENTINTART |  MERKMALKEY | AUSPRAEGUNG |
+-------------|-------------+-------------+
|      1      |     RADG    |     14      |
|      2      |     RADG    |     16      |
|      2      |     RTYP    |    Kind     |
|      9      |     RADG    |     28      |
|      9      |     RTYP    |   TRAPEZ    |
|     10      |     RADG    |     28      |
|     10      |     RTYP    |   TRAPEZ    |
|     11      |     RADG    |     28      |
|     11      |     RTYP    |   TRAPEZ    |
|     12      |     RADG    |     28      |
|     12      |     RTYP    |   SPORT     |
|     13      |     RADG    |     29      |
|     13      |     RTYP    |   SPORT     |
+-------------+-------------+-------------+

Folgendes funktioniert im Prinzip:
SQL:
SELECT mm_produktliste.modell, mm_produktliste.produkt, mm_artikelmerkmale.auspraegung
FROM mm_produktliste,mm_artikelmerkmale
WHERE mm_artikelmerkmale.parentintart=mm_produktliste.intartnr
AND mm_artikelmerkmale.merkmalkey="RTYP"
GROUP BY 1,2,3

Für das Modell "Trallala" mit der INTARTNR 1 aus der Tabelle mm_produktliste, gibt es jedoch in der Tabelle mm_artikelmerkmale kein Inhalt "RTYP" in der Spalte MERKMALKEY.
Damit taucht das Modell dann auch nicht auf. Wie sich schon ahnen lässt, kommen da später noch weitere Kriterien der Tabelle mm_artikelmerkmale hinzu. Vielleicht ist das für die Lösung zu wissen wichtig.

Ich habe das dann unter anderem so versucht:
SQL:
SELECT DISTINCT mm_produktliste.modell, IIF(mm_artikelmerkmale.merkmalkey IS NULL, ' N/A ', mm_artikelmerkmale.merkmalkey) AS Auspraegung FROM mm_produktliste.modell,mm_artikelmerkmale.auspraegung LEFT JOIN mm_artikelmerkmale.merkmalkeyON mm_artikelmerkmale.parentintart=mm_produktliste.intartnr AND mm_artikelmerkmale.merkmalkey='RTYP'

Das gibt aber die Fehlermeldung:
Code:
#1142 - SELECT command denied to user 'meinUser' for table 'modell'

Könnt ihr nochmal draufgucken?
 
Zuletzt bearbeitet:
Moin Spelmann,

also deine Zeile kann aber nicht durch Copy&Paste entstanden sein.
Versuch mal so
SQL:
SELECT DISTINCT p.modell,
     CASE WHEN m.merkmalkey IS NULL THEN  ' N/A ' 
              ELSE  m.merkmalkey 
END AS Auspraegung
     
FROM mm_produktliste as p
  LEFT JOIN mm_artikelmerkmale as m  
    ON m.parentintart=p.intartnr AND m.merkmalkey='RTYP'

Da deine Fehlermeldung eine mySQL-Fehlermeldung ist, habe ich auch gleich das IIF() wie oben angedeutet abgeändert.

Grüße
Biber
 
Hi Biber3, vielen Dank, das sieht sehr gut aus.
Der Vollständigkeit halber hier nochmal die Zusammenfassung mit Gruppierung aller drei Felder:
PHP:
$resultPRODUKTE = $this->Database->query
("SELECT DISTINCT p.modell,p.produkt,m.auspraegung,
CASE WHEN m.merkmalkey IS NULL
THEN ' N/A 'ELSE  m.merkmalkey END AS Auspraegung
FROM mm_produktliste AS p LEFT JOIN mm_artikelmerkmale
AS m ON m.parentintart=p.intartnr AND m.merkmalkey='RTYP'
GROUP BY p.modell,p.produkt,m.auspraegung");
PHP:
while($resultPRODUKTE->next())
        {
            echo $resultPRODUKTE->modell." | ".$resultPRODUKTE->produkt." | ".$resultPRODUKTE->auspraegung."<br>";
        }
Jetzt ist Urlaub, den ich nun anfangen kann, ohne ständig über das Problem grübeln zu müssen. Danke dafür :)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück