SQL Join für Musikdatenbank (2 M:N zu einen Warenkorb)

  • Ersteller Ersteller Furtano
  • Erstellt am Erstellt am
F

Furtano

Gast
Hi,

im Anhang ein Ausschnitt des ER-Modell zur Musikdatenbank.

Ich möchte einen Join haben, so dass ich eine Auflistung der Warenkörbe habe, also eine gesamte Einkaufsliste habe.


Es sollen also nur die Tabellen Album_has_Warenkorb und Warenkorb_has_Musiktitel zusammengeschmissen/beachtet werden.

Wie mache ich das am Besten?

Habe schon UNION JOIN (zu wenig Ergebnisse) und INNER JOIN (zu viele Ergebnisse) probiert.
 

Anhänge

  • ausschnitt_join.jpg
    ausschnitt_join.jpg
    81,9 KB · Aufrufe: 291
Zuletzt bearbeitet von einem Moderator:
Müsste es nicht Warenkorb_has_Album heißen (mal abgesehen davon, dass Warenkorb basket/shopping cart heißt)? Aber der Rest ist ja auch Deutsch ;).

Zu deiner Frage. Es müsste so gehen:
SELECT statement UNION SELECT statement;

Wenn du mit UNION JOIN mein Beispiel meinst, probiere es mal mit UNION ALL. Dann werden identische Einträge zwischen den beiden Tabellen nicht gefiltert.
 
PHP:
SELECT *
FROM Album_has_Warenkorb
UNION ALL SELECT *
FROM Warenkorb_has_Musiktitel

Fehler: #1054 - Unknown column 'Warenkorb_has_Musiktitel.Musiktitel_idMusictitle' in 'order clause'
 
Dein Problem ist vermutlich die Reihenfolge der Spalten. Du musst die Spalten nicht mit * sondern einzeln ansprechen damit die Reihenfolge für den UNION passt. Eigentlich sollte es technisch auch so gehen, nur wäre bei dir dann eben kein ordentlicher (logischer) UNION möglich.

[Nachtrag]
Nach deiner Fehlermeldung zufolge verwendest du MySQL. Der Befehl UNION wird definitiv unterstützt. Schau dir mal das Handbuch (http://dev.mysql.com/doc/refman/5.1/de/union.html) dazu an. Die gehen auch auf den Fehler ein. Ohne es jetzt detailliert gelesen zu haben, musst du evtl. zwingend ein ORDER BY hinzufügen.
 
Zuletzt bearbeitet:
Mit
PHP:
SELECT Warenkorb_idWarenkorb, Musiktitel_idMusictitle
FROM Warenkorb_has_Musiktitel
UNION ALL SELECT Warenkorb_idWarenkorb, Album_idAlbum
FROM Album_has_Warenkorb

bekomme ich nur das:


Warenkorb_idWarenkorb | Musiktitel_idMusictitle
1 | 2
3 | 4

// ja ich verwende mysql
 
Ich habe hier leider keine Datenbank um das zu testen. Was genau ist an der Ausgabe nicht korrekt? Mit welchen Testdaten sind denn deine Tabellen gefüllt?

[Nachtrag]
Kannst du mir die Testdaten nennen? Ich würde sie gerne bei mir in die DB eintragen.

[Nachtrag2]
Ich hab jetzt selber Datensätze eingefügt. Es sind insgesamt 7 Einträge, wobei sich einer überschneidet. Deine Abfrage gibt alle Datensätze wieder, die Abfrage nur mit UNION 6 Stück. Soweit wie ich das beurteilen kann, ist das so alles in Ordnung.

Sollte sich deine Aussage auf die Bezeichnung der Spalten beziehen, so ist das eine Notwendigkeit. Der SQL Server kann eine Spalte nur einfach benennen, weswegen irgendeine der Originalspalten (vlt. die aus dem ersten SELECT) herangezogen wird.
 
Zuletzt bearbeitet:
Mit der Abfrage:
Code:
SELECT Warenkorb_idWarenkorb, Musiktitel_idMusictitle
FROM Warenkorb_has_Musiktitel
UNION ALL SELECT Warenkorb_idWarenkorb, Album_idAlbum
FROM Album_has_Warenkorb

Ich hab die zwei Tabellen aus deinem Datenbankdiagramm entnommen, nachgebaut, mit Testdaten gefüllt und den Query genau so, wie du sie gepostet hast, ausgeführt.
 
Zurück
Oben