• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

SQL-Query verhält sich nicht wie gedacht

Crashdown

New member
Schönen Abend liebe Community,
ich weis der Titel ist nicht sonderlich Ausdrucksstark aber genau so ist es. Ich bastel gerade an einer MP3-Verwaltungssoftware für mich und nehme beim hinzufügen neuer Tracks die Discogs-Datenbank zu hilfe um die passenden Daten in meine ID3-Tags zu schreiben.

Dazu habe ich die Tabellen discogs_releases und discogs_artists welche über das feld artist_id verknüpft sind (und zwei Millionen Alben und deren Künstler beinhalten) und eine Tabelle releases, die eigentlich discogs_releases entspricht aber nur die Alben enthält, zu denen auch schon Mp3s hochgeladen wurden.

Jetzt lade ich einen neuen Song hoch und folgende Abfrage wird generiert:

SELECT discogs_releases.*, COUNT( releases.release_id ) AS number
FROM releases
RIGHT JOIN discogs_releases ON ( discogs_releases.release_id = releases.release_id )
LEFT JOIN discogs_artists ON ( discogs_releases.artist_id = discogs_artists.artist_id )
WHERE discogs_releases.artist_id = 'IdDesKünstlers'
AND discogs_releases.name LIKE 'NameDesAlbums'

Diese Abfrage soll Vorschläge liefern, zu welchem Album der Song gehören könnte und gleich mitausgeben, ob ein Album schon in der Mediathek steht. Lasse ich die Verknüpfung zu der Medithek weg, erhalte ich für ein Beispiel 9 mögliche Alben, mit der Verknüpfung wird nur das eine Ausgegeben, welches schon in der Mediathek steht. Was stimmt mit meinen Joins nicht?
 
Es ist nicht ganz klar was du willst. Du sprichst von "zu welchem Album der Song" gehört, in der abfrage steht aber was von "IdDesKünstlers" - also suchst du Künstler. willst du jetzt alle Songs von einem Künstler? und jeweils das Album dazu? Und was ist die "mediathek"? discogs_releases oder releases? stehen da Alben drin oder songs oder beides?
 
Also discogs_releases ist die große Datenbank in der alle Alben stehen, die das Discogsprojekt schon gesammelt hat. releases ist meine eigentliche Mediathek. IdDesKünstlers wird als bekannt vorrausgesetzt. Ich suche also alle Alben eines bestimmten Künstlers, die den Namen NameDesAlbums besitzen. Da ein Album oft als Maxi, Lp, Deluxeversion.... erscheint können davon schon mal mehrere in discogs_releases stehen. Damit jetzt der User besser entscheiden kann, welchem dieser Alben er den Song zuweisen will soll gleich bei der Abfrage von Albenvorschlägen geprüft werden welche dieser Alben denn schon in der Mediathek stehen
 
Deine Erklärungen gehen nicht auf meine Fragen ein. Noch mal: Du redest von Songs und von Alben, gibt es dafür verschiedene Tabellen oder sind alle Songs in EINER Tabelle?

Damit jetzt der User besser entscheiden kann, welchem dieser Alben er den Song zuweisen will soll gleich bei der Abfrage von Albenvorschlägen geprüft werden welche dieser Alben denn schon in der Mediathek stehen
Wenn ich dich richtig verstehe, dann möchtest du anhand einer Userangabe nach Alben eines Künstlers suchen? Und wenn ich deine Beschreibung der Datenstruktur richtig vestehe, dann reicht es aus, die Tabelle discogs_releases zu durchsuchen, da releases ja nur eine Untermenge ist.

Insofern würde ich mal raten, dass du in etwa sowas suchst (natürlich ungetestet):

Code:
SELECT discogs_releases.*, 
FROM discogs_artists
LEFT JOIN  discogs_releases USING (artist_id)
WHERE discogs_releases.artist_id = 'IdDesKünstlers'
AND discogs_releases.name LIKE 'NameDesAlbums'
 
Also das ganze läuft so ab, der User lädt einen Song hoch, ein script liest die Id3 Tags aus der Mp3-Datei aus. Jetzt erhalten wir verschiedene Fälle. Einer davon, um den es hier geht, ist, dass die Id des Künstlers über eine Abfrage mit dem ID3-Tag und der Tabelle discogs_artists bestimmt werden konnte. Dem User sollen jetzt alle Alben dieses Künstlers angezeigt werden ( oder in unserem Fall noch eingegrenzt durch NameDesAlbums (auch aus den ID3-Tags)). Der User wählt dann, zu welchem Album er die Datei zuordnen will. Zuordnen heist, das script schreibt die Informationen zu dem Album in die ID3-Tags der Mp3-Datei, kopiert diese in einen Mediathekordner und erstellt weitere Datensätze, unter anderem auch einen in der Tabelle releases, der aber ein Abbild von dem in release darstellt.
Bei den Alben, die dem User zur Auswahl gegeben werden sollen aber nicht nur Daten wie der Name, Veröffentlichungsdatum usw. abgerufen werden, um dem User die Entscheidung zu erleichtern, sondern auch die Information, ob ein Track aus diesem Album schon in der Mediathek steht sprich ob das Album schon in releases eingetragen wurde. Daher der COUNT() - Befehl. So vermeide ich, dass Tracks aus dem selben Album verschiedenen Veröffentlichungsversionen dieses Albums zugeordnet werden.
 
Zuletzt bearbeitet:
Du rückst nur Scheibchenwiese mit den notwendigen Informationen raus, das macht es extrem schwer dir zu helfen. Warum ist es möglich, dass ein Album mehrfach in die Tabelle releases eingetragen wird? Und was ist auf einmal 'release_proposals'?
 
Sorry, ich bin ziemlich in der Sache drin, da fällt es mir oft nicht auf wenn Dinge unverständlich sind. Das mit dem release_proposals ist meinen Finger rausgerutscht, ich meinte aber releases. Anfangs habe ich mit der API von Discogs gearbeitet. Dabei hätte ich in unserem Fall die Alben eines Künstlers erst von der API beziehen müssen um sie dem User zur Auswahl zu geben. Da die API öfter mal nicht zu erreichen war oder meinen Ansprüchen nicht genügte habe ich mir die gesamte Discogsdatenbank, die einmal im Monat als XML veröffentlicht wird heruntergeladen und in die tabellen discogs_releases und discogs_artists eingespeist. Diese Tabellen sind nur beim importieren wichtig. Und dann gibt es auf der anderen Seite die eigentliche Mediathek. Das sind die Tabellen tracks, releases und artists. Ich brauche eigentlich eine Abfrage, die nach bestimmten Datensätzen aus discogs_releases sucht und gleich für jeden Datensatz abgleicht, ob er auch in der Tabelle releases vorhanden ist und mir diese Information in einem weiteren Feld, in meiner Abfrage war es number ( obwohl es dank unique nur werte von 1 und 0 für dieses Feld geben wird) ausgibt. Ich will vermeiden, alle gefundenen Alben nochmal in einer Schleife zu durchlaufen und diese Information seperat zu ermitteln.
 
Das ist schon klar, nur warum erwartest du das ein Album mehrmals in der Tabelle releases ist? Ansonsten macht der count doch keinen Sinn? (Wobei der count nur mit mySQL funktioniert und eigentlich musst du nach SQL Definition nach dem Feld gruppieren.)

Wenn das nicht so ist, dann ist die Abfrage sehr einfach:
Code:
SELECT discogs_releases.*, releases.artist_id AS release
FROM discogs_artists
LEFT JOIN  discogs_releases USING (artist_id)
LEFT JOIN  releases USING (artist_id)
WHERE discogs_releases.artist_id = 'IdDesKünstlers'
AND discogs_releases.name LIKE 'NameDesAlbums'
Jetzt müßtest du alle Informationen haben die du suchst
 
Zuletzt bearbeitet:
Ne der Count ist wirklich nicht nötig, da ein Album in releases auch nur ein oder kein mal vorkommen kann. Deine Abfrage läuft. Sorry da stand ich mal wieder ordentlich auf dem Schlauch ;)
 
Zurück
Oben