SQL Abfrage mit "verknüpften" Tabellen

Status
Nicht offen für weitere Antworten.

GRudiD

Aktives Mitglied
Hallo,

ich schreibe momentan an einer Verwaltungssoftware für Audio-Dateien auf Datenbankbasis. An der Datenbank an sich kann ich nichts ändern.

Die Struktur sieht u.a. folgendermaßen aus:
eine Tabelle für die Audio-Dateien [audio_files]
eine Tabelle für die Interpreten [artists] und
eine Tabelle, die die Tabellen [audio_files] und [artists] per id verbindet [relation] (id, audioFileID, artistID).

So ist es möglich, dass einer Audio-Datei mehrere Interpreten zugewiesen werden können und andersherum ein Interpret mehreren Audio-Dateien angehören kann.

Ich versuche nun allerdings schon seit geraumer Zeit eine SQL-Abfrage zu erstellen, ähnlich dieser: "Gebe mir alle!!! Einträge aus [audio_files] und verknüpfe sie anhand der Tabelle [relations] mit den entsprechenden Interpreten aus [artists]"

SELECT audio_files.title, artists.name FROM audio_files INNER JOIN relation, artists WHERE relation.audioFileID = audio_files.id AND relation.artistID = artists.id;

Probleme dabei sind:
1. Die Einträge sind so oft vorhanden, wie Interpreten zugeordnet sind.
Gibt es eine Möglichkeit die Interpreten z.B. Trennzeichen getrennt in eine einzelne Zelle zu schreiben?
title = "blabla" | artist = "artist1,artist2"

2. Wenn einem Eintrag keine Interpreten zugeordnet sind (kein Eintrag in [relation]), wird dieser auch nicht zurückgegeben.

Also Lösung ist mir der Gedanke gekommen, eine verschachtelte Abfrage zu nehmen "Gebe mir alle Einträge aus [audio_files] zurück" und für jeden Eintrag dann "Gebe mir alle Interpreten mit der relation.audioFileID = ... zurück". Die Lösung ist aber so zeitintensiv, dass ich bei 10000 Dummydaten ruhig mal eine Tasse Kaffee trinken kann.

Hat jemand einen Lösungsvorschlag?
 

Ivanhoe

Mitglied
1. kann hier nur den Count anbieten:

2. versuch doch folgendes:
SELECT af.title, count(r.id)
FROM audio_files af
LEFT OUTER JOIN relation r ON
r.audioFileID = af.id
GROUP BY af.title;
 

bronks

Top Contributor
GRudiD hat gesagt.:
... Hat jemand einen Lösungsvorschlag?
Je nach Datenbankmaschine gibt es ganz spezielle Möglichkeiten, sowas einfacher oder komplizierter umzusetzen. Ich will Dich aber nicht dazu drängen uns Deine Geheimnisse auszuplaudern. :wink:
 

GRudiD

Aktives Mitglied
Vielen Dank für die schnellen Antworten.

@Jockel: Den DISTINCT Befehl habe ich mir schon angesehen. Problem dabei ist nur, dass dann nur der erste Interpret angezeigt wird und alle weiteren ignoriert werden.

@Ivanhoe: Dieser Befehl funktioniert zwar ganz gut, hat nur den Nachteil, dass er relativ langsam läuft. Ich habe das mal mit nur 10!!! Einträgen (LIMIT 10) versucht. Dafür hat er schon gut 2 Sekunden gebraucht. auf gute 10000 Einträge hochgerechnet, ich will gar nicht dran denken ...

@bronks: Ich nutze momentan die MySQL Datenbank 5.0. Wenn du das meinst. Wenn du mehr wissen willst, meld dich einfach :)

Ich habe nun einmal versucht, nur die audio_files DB auszulesen (ohne die artists, 1.7 Sekunden), diese in einen Vector für eine JTable gespeichert und nur die Interpreten zu laden, wenn der Eintrag angezeigt wird. So richtig fix läuft das allerdings auch nicht. Zumal ich für jeden Track die Daten einzeln abrufn muss (Connection, Statement, ResultSet erstellen, Abfrage tätigen, Ergebnisse eintragen und alles wieder schließen).

Hier mal der Quelltext für die TrackItems, die im JTable angezeigt werden. Momentan wichtig ist dabei die Methode loadArtists().
Code:
public class TrackItem {

	private int id;
	private String name;
	private List<String> artists;

	public TrackItem(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return this.id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void loadArtists(){
		if (this.artists == null) {
			this.artists = new ArrayList<String>();
			
			try {
				Statement statement = Command.getConnection().createStatement();
				ResultSet resultSet = statement
						.executeQuery("SELECT artists.name FROM artists INNER JOIN artist_audio_file_relation, audio_files WHERE artist_audio_file_relation.artistID = artists.id AND artist_audio_file_relation.audioFileID = audio_files.id AND artist_audio_file_relation.audioFileID = "
								+ this.id);
				
				while (resultSet.next()) {
					this.artists.add(resultSet.getString("name"));
				}
				
				resultSet.close();
				statement.close();

				resultSet = null;
				statement = null;
			} catch (SQLException exception) {
				exception.printStackTrace();
			}
		}
	}
	
	public List<String> getArtists() {
		this.loadArtists();
		return this.artists;
	}

	public String toString() {
		return "<html>" + this.getName() + "
<span style=\"color:gray\">" + this.getArtists().toString() + "</span></html>";
	}
}
 

Ivanhoe

Mitglied
@Ivanhoe: Dieser Befehl funktioniert zwar ganz gut, hat nur den Nachteil, dass er relativ langsam läuft. Ich habe das mal mit nur 10!!! Einträgen (LIMIT 10) versucht. Dafür hat er schon gut 2 Sekunden gebraucht. auf gute 10000 Einträge hochgerechnet, ich will gar nicht dran denken ...

Was für eine DB verwendest du? Und auf welcher Maschine läuft das Ganze? Z.B. für Oracle sind die 10000 auch nicht viel.
 

GRudiD

Aktives Mitglied
Wie gesagt, das Ganze läuft auf MySQL 5.0. Nutzen tue ich für die Entwicklung einen 3GHz PC mit 512MB Ram.

10000 Einträge sind dabei auch nicht das Problem, solange ich nur INNER JOIN nutze. Bei LEFT JOIN etc. braucht er allerdings brachial mehr Zeit.

Ich habe leider nicht die Möglichkeit das Datenbanksystem zu wechseln, da es bereits seit geraumer Zeit fertig auf einem Server leigt und der nun mal MySQL nutzt.
 

GRudiD

Aktives Mitglied
Status: gelöst!

Also, mit LEFT JOIN braucht mein Rechner rund 28 Minuten für 10000 Einträge. Ich habe das nun so gelöst, in dem ich alle Einträge aus der Tabelle audio_files in eine Hashtable geladen habe (key = id). In einer zweiten Abfrage habe ich dann mittels INNER JOIN die verknüpften Elemente "drüberkopiert".
Macht dann nur noch rund 4 Sekunden für 10000 Einträge.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
L PostgreSQL Abfrage mit EclipseLink Datenbankprogrammierung 7
S Berechnung des Datumsunterschieds in der SQL-Abfrage Datenbankprogrammierung 1
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
nonickatall MySQL SQL Abfrage erneut ausführen oder rs aktualisieren Datenbankprogrammierung 14
Kirby.exe Verständnisproblem bei SQL Abfrage Datenbankprogrammierung 27
N SQL-Abfrage in JTextField ausgeben Datenbankprogrammierung 6
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
W MySQL DB Abfrage in Array, gemischte Array, generelles vorgehen Datenbankprogrammierung 4
D SQL Abfrage optimieren Datenbankprogrammierung 35
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
D Regelmäßige Abfrage aus Workbench Datenbankprogrammierung 6
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
E Abfrage auf HSQLDB Datenbankprogrammierung 4
M MySQL SQL Abfrage in JTable mit Berechnung Datenbankprogrammierung 3
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
S SQL Abfrage Datenbankprogrammierung 2
F Abfrage der letzten Einträge Datenbankprogrammierung 2
J SELECT Abfrage/Suche Datenbankprogrammierung 4
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
OnDemand SQL Abfrage und Equals Datenbankprogrammierung 4
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
M MySQL MySQLSyntaxError in Java, obwohl Abfrage in HeidiSQL korrekt Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
L SQL-Abfrage bricht vor dem Ende ab Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Derby/JavaDB Komplexe Abfrage vereinfachen Datenbankprogrammierung 2
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
D MySQL Erstellen der richtigen Abfrage Datenbankprogrammierung 3
D MySQL DB Abfrage Prüfen Datenbankprogrammierung 10
D JDBC insert mit select abfrage Datenbankprogrammierung 5
E PostgreSQL Exception too ...many clients already bei DB-Abfrage Datenbankprogrammierung 14
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
Mrtwomoon Abfrage-Ergebnisse in einem Fenster darstellen Datenbankprogrammierung 8
0 SQL Abfrage Bestellung Datenbankprogrammierung 15
G SQLite SQLite Abfrage Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
B My-SQL Abfrage - Out Of Memory Error Datenbankprogrammierung 13
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
K SQLite Einfache DB-Abfrage Datenbankprogrammierung 2
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
C Sortierung bei SQL-Abfrage Datenbankprogrammierung 3
B Bei Abfrage schießt der Speicher in die Höhe Datenbankprogrammierung 6
M SQL Abfrage Dupliakte bei Kreuzvergleich Datenbankprogrammierung 2
M Access Abfrage mit Parameter & Access/Java liefern unterschiedliche Ergebnisse Datenbankprogrammierung 2
G SQL Abfrage Datenbankprogrammierung 5
C SQL-Abfrage Datenbankprogrammierung 4
B SQL-Abfrage Datenbankprogrammierung 4
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
C Wert in SQL-Abfrage zählen lassen Datenbankprogrammierung 8
R Memory leaks bei DB Abfrage Datenbankprogrammierung 16
S Abfrage auf SQLite-DB Datenbankprogrammierung 2
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G Abfrage von Teilnehmern Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
A MySQL Ergebnss aus SQL Abfrage in Hauptklasse verwenden Datenbankprogrammierung 3
N Geschwindigkeit bei if Abfrage Datenbankprogrammierung 11
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G Performante SQL- Abfrage (LIKE %) Datenbankprogrammierung 21
G Join Abfrage Datenbankprogrammierung 12
M db abfrage fehlerhaft Datenbankprogrammierung 5
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2
H MySQL Datenbank Abfrage Datenbankprogrammierung 10
André Uhres SQL Abfrage erkennt keine Buchstaben mit Akzenten (z. B. é, è) Datenbankprogrammierung 3
E MySQL Klasse zur Abfrage statisch oder Standard Datenbankprogrammierung 5
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
G M:N Abfrage Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben