SQL-Statement SELECT über 3 Tabellen

C

Camino

Gast
Hallo, ich hab da gerade ein Problem mit einem SQL-Statement und grübel da schon einige Zeit erfolglos darüber nach. Vielleicht kann mir ja hier jemand weiterhelfen.

Und zwar hab ich 3 Tabellen mit Interpreten, CDs und Tracks, in denen die Musik auf CDs gespeichert/verwaltet werden sollen.

musik_interpreten
-----------------
id
name


musik_cds
----------
id
interpret_id
titel
jahr
original
info
discs


musik_tracks
------------
id
interpret_id
cd_id
titel
disc_nr
track_nr


Nun möchte ich in meiner Anwendung alle Interpreten in einer JTable aufgelistet haben und dazu deren Anzahl der CDs und Tracks. Aber irgendwie komme ich mit dem SQL-Statement nicht klar. Ich muss ja die 3 Tabellen miteinander verbinden, also entweder über JOIN oder Primärschlüssel der Interpreten gleich Fremdschlüssel in den anderen beiden Tabellen. Und dann auch noch mit COUNT und GROUP BY arbeiten? Oder nicht?

Bisher kam ich zu so einem SQL-Code:
Code:
SELECT i.id, i.name, COUNT(c.titel) AS cdcount, COUNT(t.titel) AS trackcount
FROM musik_interpreten i, musik_cds c, musik_tracks t
WHERE c.interpret_id = i.id AND t.interpret_id = i.id
GROUP BY i.name, i.id ORDER BY i.name

Das ResultSet sollte dann in eine ArrayList<Interpret> gespeichert werden:
Java:
Interpret interpret = new Interpret(rs.getInt("id"), rs.getString("name"), 
     rs.getInt("cdcount"), rs.getInt("trackcount"));

Was aber leider nicht funktioniert, bzw. nur 2 Interpreten mit seltsamen (falschen, viel zu hohen) Zahlen ausgibt. Über Tipps zum richtigen SQL-Statement (vielleicht auch mit eienr Erläuterung) wäre ich sehr dankbar...
 

togal

Mitglied
Du hast 2x den Verweis auf Interpret in Deinem Datenmodel und verwendest Ihn auch 2x im Select. Das ist etwas schief.
Ich kann mir vorstellen, dass eine CD nur Lieder von einem Interpret enthält, ich kann mir aber auch vorstellen, dass eine CD Lieder von verschiedenen Interpreten enthält. So wie es im Datenmodell definiert ist, ist es redundant.
Das könnte man ignorieren, wenn die Daten ordentlich eingetragen sind und die Abfrage entsprechend formuliert ist.

Also, wie wärs, wenn Du das Join Criterium zwischen CD und Tracks einbaust?

Was geschieht mit Deinen Daten, wenn Du eine Tabelle in der From Clause angibst, aber keine richtige Joinbedingung lieferst?
> Es werden alle passenden Daten miteinander gejoined, Counts können dadurch höher ausfallen, als erwartet.

Versuch Dein SQL mal gerade zu ziehen.
 

Camill

Bekanntes Mitglied
Folgendes sollte funktionieren:
SQL:
SELECT id, name, 
    (
        SELECT COUNT(musik_cds.id)
        FROM musik_cds
        WHERE musik_cds.interpret_id = musik_interpreten.id
    ) AS AnzCDs,
    (
        SELECT COUNT(musik_tracks.id)
        FROM musik_tracks
        WHERE musik_tracks.interpret_id = musik_interpreten.id
    ) AS AnzTracks
FROM musik_interpreten
 
C

Camino

Gast
Du hast 2x den Verweis auf Interpret in Deinem Datenmodel und verwendest Ihn auch 2x im Select. Das ist etwas schief.
Im Datenmodel 2mal? Wo denn? Das Datenmodel Interpret hat doch als Felder nur: id, name, cdcount und trackcount.
Und im SELECT gibt es einmal den Fremdschlüssel interpret_id in der Tabelle musik_cds (c) und einmal in musik_tracks (t).

Ich kann mir vorstellen, dass eine CD nur Lieder von einem Interpret enthält, ich kann mir aber auch vorstellen, dass eine CD Lieder von verschiedenen Interpreten enthält. So wie es im Datenmodell definiert ist, ist es redundant.
Das könnte man ignorieren, wenn die Daten ordentlich eingetragen sind und die Abfrage entsprechend formuliert ist.
Für die CDs mit verschiedenen Interpreten hab ich einen Interpret mit dem Namen "Diverse Interpreten" angelegt. Bei den Tracks allerdings wird dann ja ein Interpret eingetragen. Keine Ahnung ob das so ok ist oder ob es noch bessere Lösungen dafür gibt.

Also, wie wärs, wenn Du das Join Criterium zwischen CD und Tracks einbaust?
Kannst du mir das nochmal ein bisschen geanuer erklären?

Was geschieht mit Deinen Daten, wenn Du eine Tabelle in der From Clause angibst, aber keine richtige Joinbedingung lieferst?
> Es werden alle passenden Daten miteinander gejoined, Counts können dadurch höher ausfallen, als erwartet.

Versuch Dein SQL mal gerade zu ziehen.
Ich versteh zwar nicht so ganz, was du meinst, aber ich denke auch, dass mein SQL das Problem ist. Wenn ich nur wüsste, wie ich es "gerade ziehen" kann.
 
C

Camino

Gast
Folgendes sollte funktionieren:
SQL:
SELECT id, name, 
    (
        SELECT COUNT(musik_cds.id)
        FROM musik_cds
        WHERE musik_cds.interpret_id = musik_interpreten.id
    ) AS AnzCDs,
    (
        SELECT COUNT(musik_tracks.id)
        FROM musik_tracks
        WHERE musik_tracks.interpret_id = musik_interpreten.id
    ) AS AnzTracks
FROM musik_interpreten

Hey cool, das sieht auf jeden Fall schon mal richtig aus. Hab nur noch ein
Code:
ORDER BY name
hinten dran gehängt, damit das ganze alphabetisch nach Interpreten sortiert ist. DANKE!
 

bananajoe

Mitglied
Was aber leider nicht funktioniert, bzw. nur 2 Interpreten mit seltsamen (falschen, viel zu hohen) Zahlen ausgibt. Über Tipps zum richtigen SQL-Statement (vielleicht auch mit eienr Erläuterung) wäre ich sehr dankbar...

Ich kenne die Daten nicht. Es könnte aber sein, dass die Abfrage ein chasm oder fan-trap beinhaltet. Das geschieht leider nicht nur wenn man über sogenannte Kataloge von Business Object oder Cognos selektiert, sondern auch in SQLs. Camills Lösung geht den richtigen Weg. Zuerst müssen die Werte addiert werden und dann kommt der Join. Geht man den umgekehrten Weg, sind die Werte viel zu hoch!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Select über mehrere Datenbanksysteme Datenbankprogrammierung 14
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
OnDemand Select * from bringt keine Rückgabe Datenbankprogrammierung 49
OnDemand Select vs Update ins blaue, was ist teurer? Datenbankprogrammierung 11
M JPA: select all mit unterschiedlichem Tablename Datenbankprogrammierung 2
A MySQL Select und Insert in Java Datenbankprogrammierung 15
J JPA: Wie sieht der select aus? Datenbankprogrammierung 2
D geänderte SELECT Abfragen Datenbankprogrammierung 15
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
T sqlite select Datenbankprogrammierung 12
D Oracle NullPointerException bei select mit Null Values Datenbankprogrammierung 5
F MySQL Was bedeuten die Einzelnen Zeichen in Select Querrys? Datenbankprogrammierung 1
J SQL SELECT mit einem Array Datenbankprogrammierung 1
J SELECT Abfrage/Suche Datenbankprogrammierung 4
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
M SQL-Exception trotz funktionierendem SELECT Datenbankprogrammierung 4
U PostgreSQL SELECT Statement Datenbankprogrammierung 5
L Select Anweisung wird falsch interpretiert Datenbankprogrammierung 3
C HSQLDB Platzhalter in SELECT Datenbankprogrammierung 6
I SELECT bei Datenbankverbindung Datenbankprogrammierung 6
C MySQL JPA - namedQuery (SELECT) -getResultList() - liefert falsches Ergebnis Datenbankprogrammierung 1
S select: alle ergebnisse ermitteln Datenbankprogrammierung 5
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
H HSQLDB insert .... values("test1",select test2 from foo) Datenbankprogrammierung 2
D JDBC insert mit select abfrage Datenbankprogrammierung 5
W SELECT oder Programm-Logik Datenbankprogrammierung 10
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
T MySQL Dynamisch Suchen Select Datenbankprogrammierung 4
D ArrayList in Select Datenbankprogrammierung 12
N Select mit join Datenbankprogrammierung 3
F Oracle select sum() join select sum() Datenbankprogrammierung 9
B SELECT ja - INSERT nein (MySQL) Datenbankprogrammierung 3
R Oracle Performance bei SELECT mit vielen Reihen Datenbankprogrammierung 5
T MySQL Db select * und Insert schlagen fehl Datenbankprogrammierung 2
I Select-Statement optimieren Datenbankprogrammierung 14
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
R Derby/JavaDB Möglichkeit von einem Random Select! Datenbankprogrammierung 6
B Mehrfachschachtelung SELECT Datenbankprogrammierung 2
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
GianaSisters MySQL Datenbank Select error Datenbankprogrammierung 5
R Select Statement als temporärer Table Datenbankprogrammierung 7
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
R Derby/JavaDB Select TOP Statement geht nicht Datenbankprogrammierung 3
S MySQL Problem mit SELECT bzw encoding Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
F wie funktioniert if Statement in SELECT? Datenbankprogrammierung 2
J [Hibernate] Select Statement Datenbankprogrammierung 4
A SQLite SELECT von ungleichen Spaltenpaaren Datenbankprogrammierung 10
Eldorado MySQL SELECT mit GROUP BY und INNER JOIN Datenbankprogrammierung 2
M Hibernate JPQL SELECT optional? Datenbankprogrammierung 2
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
G Aufruf von SELECT INTO Datenbankprogrammierung 8
B H2 PreparedStatement SELECT * FROM ? Datenbankprogrammierung 4
X Select Query auf Substring Datenbankprogrammierung 2
S Select eines bestimmten Datensatzes Datenbankprogrammierung 4
M Select * from mydaten where ... Datenbankprogrammierung 4
T Unerwartete Datenbankausgabe bei "select now()" (es wird ein .0 angehängt) Datenbankprogrammierung 5
M Probleme bei Select in Schleife Datenbankprogrammierung 7
G SELECT liefert leere Zeilen Datenbankprogrammierung 32
M SELECT longtext -> als String behandeln Datenbankprogrammierung 6
H Select in einem Select Datenbankprogrammierung 7
G Select- Abfrage Datenbankprogrammierung 19
S Insert mit Select Datenbankprogrammierung 6
G MSSQL Server SELECT Abfrage funktioniert nicht Datenbankprogrammierung 4
R SELECT aus hsqldb mit Parameter Datenbankprogrammierung 2
H Beim insert bekomme ich den Fehler missing select keyword Datenbankprogrammierung 2
A Problem mit einem Select-Befehl Datenbankprogrammierung 5
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
P SELECT Datenbankprogrammierung 20
T select Abfrage in Java Integer speichern ? Datenbankprogrammierung 2
B fehler bei select befehl Datenbankprogrammierung 5
S Select von bis in DB2 Datenbankprogrammierung 8
S Select mit PreparedStatement Datenbankprogrammierung 2
E Ein If und ein SELECT in Oracle? Datenbankprogrammierung 2
T Select Statement auf Relation Datenbankprogrammierung 3
S PostgreSQL SELECT/UPDATE etc. Datenbankprogrammierung 4
4 Probleme mit Select abfrage Datenbankprogrammierung 4
G Fehler in der select-Abfrage Datenbankprogrammierung 3
N SELECT: Datensatz sperren Datenbankprogrammierung 6
isowiz SELECT SUM() Ergebnis in Java abfragen Datenbankprogrammierung 6
T LIMIT In SELECT Anweisung Datenbankprogrammierung 4
R Select und Insert in Schleife - Problem mit ResultSet Datenbankprogrammierung 2
G SELECT Name= " " verhindern Datenbankprogrammierung 5
G Syntax für Select - Abfrage mit Variablen Datenbankprogrammierung 39
J SELECT-Statement Datenbankprogrammierung 4
R Select auf der Konsole ausgeben Datenbankprogrammierung 2
D brauche mal kurz hilfe bei einem select-stmt Datenbankprogrammierung 6
G Select-Abfragen sind sehr langsam Datenbankprogrammierung 7
D HSQLSB SELECT Datenbankprogrammierung 9
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
tom.j85 Objekt in OneToOne Beziehung über http request anzeigen lassen Datenbankprogrammierung 3
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
J Nur CRUD über Datenbank Klasse, oder auch mehr ? Datenbankprogrammierung 2
M MySQL Passwort Clientseitig ändern und über Button ausführen Datenbankprogrammierung 0
F MySQL Einfügen von Datensätzen über Java Datenbankprogrammierung 8
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29

Ähnliche Java Themen

Neue Themen


Oben