Einzelnen Beitrag anzeigen

tgvoelker

Registriert seit: 9. Sep 2002
Ort: Oelsnitz, Vogtland
43 Beiträge
 
Delphi 12 Athens
 
#5

AW: Doppelte Tabelle in GROUP BY

  Alt 4. Jul 2012, 22:58
Ich nehme an, daß Du folgendes tun willst: Je Artikel ausgeben, wieviele Bewertungen abgegeben wurden, wie die durchschnittliche Bewertung ist und wievielen Benutzern der zugewiesen ist.

Zum Verständnis folgendes: in Deiner From-Klausel
Code:
FROM
    artikel,
    artikel_kategorien,
    artikel_benutzer,
    artikel_benutzer_wertung
bildest Du das Kreuzprodukt aller Datenmengen, aus dem Du dann mit Deiner Where-Klausel die Tupelkombinationen rausfischst, die den angegebenen Kriterien entsprechen.

Verwendest Du Joins, dann baut die Engine entsprechend der Bildungsvorschrift Kombinationen der Tupel.

Das Problem dabei ist nun, daß im Kreuzprodukt nicht-zuordbare Tupel garnicht ausgegeben werden, heißt, wenn ein Datensatz [artikel] existiert, für den kein Datensatz [artikel_benutzer_wertung] existiert, aber ein Datensatz [artikel_benutzer], dann siehst Du den NICHT in Deinem Ergebnis. Das ist bei dem Inner Join übrigens genauso.

Damit Du alle Artikel bekommst, mußt Du Outer Joins verwenden, die geben zusätzlich zu den gemäß Bildungsvorschrift gebildeten Tupelkombinationen auch die Nicht zuordenbaren aus: LEFT JOIN die nicht zuordenbaren, die links vom Operator stehen, RIGHT JOIN die rechts und FULL OUTER JOIN sowohl die rechts , als auch die links.

Zurück zu Deinem Beispiel: die Syntax ist abhängig davon, wie die Tabellen aufgebaut sind:
  1. Ist product_id eindeutig je Artikel?
  2. wird in artikel_benutzer_wertung benutzerspezifisch die Artikelbewertung erfaßt, d.h. ist dadrin eine Referenz auf den Benutzer enthalten?
  3. in diesem Kontext: sind die Bewertungen symmetrisch, d.h. jede Einzelbewertung hat die gleiche Wichtung? (Hintergrund: wenn ein Benutzer 2 mal bewertet, ein anderer nur einmal, dann beeinflußt die Doppelbewertung des einen Benutzers das ergebnis mehr, als die Einfachbewertung des anderen)
Thomas Völker
  Mit Zitat antworten Zitat