MySQL-Abfrage

flyingboy

Grünschnabel
Hallo,

ich programmiere schon ein klein wenig in SQL und php, doch jetzt komme ich nicht mehr weiter.

Ich bastele eine Suche, bei der ich Songs auf CDs finden will. Das ist eigentlich ganz einfach, jedoch ist die Idee, dass der User nur einen Teil des Songtitels eingeben muss und folglich mehrere Songtitel findet, die das Teilwort enthalten. Die Suche soll dann alle Songs finden, die dem Teilwort entsprechen und als Ergebnis listen, auf welchen CDs diese sind ist. Die Menge der CDs ist übrigens auch ggf. beschränkt, da ich z.B. angeben kann, suche die Songs mit dem Teilwort auf CDs, die in einem bestimmten Jahr erschienen sind.

Es ist für mich kein Problem, diese Abfrage zu lösen, wenn ich nur einen Song habe, aber hierbei kann es sich durchaus um mehrere Songs handeln, ich habe also ggf. mehrere SongIDs.

Meine Tabellen sehen wie folgt aus:

Record
======
RecordID (PK)
Titel
Jahr


Songs
======
SongID (PK)
Songname


Song2Record
===========
Song2RecordID
FK_SongID
FK_RecordID


Ein Beispiel der Suchmaske ist hier:
http://www.thewholive.de/record/encore.php

Ein gutes Beispiel ist das Wort "Day" für einen Songtitel, denn es gibt mehrere Stücke, die das enthalten.

Die Ziffern oben sind die SongIDs der Songs, die ein Teilwort enthalten. Die Auflistung unten ist das schon richtige Ergebnis für die Records, allerdings ohne die Einbeziehung der Songs.

Gruß und Danke
Klemens
 
Zuletzt bearbeitet:
Hallo Klemens,

wenn ich Dich richtig verstanden habe, könnte die Lösung so aussehen:
SQL:
select r.titel, s.songname 
from records r, songs s, song2record sr 
where s.songID = sr.fk_songID and r.recordID = sr.fk_recordID 
and @lower(s.songname) like '%day%' 
and (r.erscheinungsjahr = 2002 or r.erscheinungsjahr = 2003) 
order by r.titel, s.songname
Gruß, Sparks
 
Es soll Leute geben, die haben sich schon tot-normalisiert.
Warum schreibst du nicht die SongID nicht gleich in die Record?
Warum muß in C stehen wohin A auf B zugreifen soll wenn das nicht gleich selber in A stehen kann.

Wie sagt man so?
Weniger ist manchmal mehr!

gruß Clipper
 
Es soll Leute geben, die haben sich schon tot-normalisiert.
Warum schreibst du nicht die SongID nicht gleich in die Record?
Warum muß in C stehen wohin A auf B zugreifen soll wenn das nicht gleich selber in A stehen kann.

Wie sagt man so?
Weniger ist manchmal mehr!

gruß Clipper

Hi Clipper,

verstehe ich nicht. Wie soll ich denn die SongID in die Record schreiben?

Gruß
Klemens
 
Hallo Klemens,

wenn ich Dich richtig verstanden habe, könnte die Lösung so aussehen:
SQL:
select r.titel, s.songname 
from records r, songs s, song2record sr 
where s.songID = sr.fk_songID and r.recordID = sr.fk_recordID 
and @lower(s.songname) like '%day%' 
and (r.erscheinungsjahr = 2002 or r.erscheinungsjahr = 2003) 
order by r.titel, s.songname
Gruß, Sparks

Hi Sparks,

danke, ich werde das probieren.

Gruß
Klemens
 
ich würde die datenbank so aufbauen:

Record
======
RecordID (PK)
Titel
Jahr


Songs
======
SongID (PK)
Songname
RecordID

der SQL-Abfragecode sieht dann so aus:

SELECT Songs.Songname, Record.Titel
FROM Songs, Record
WHERE Songs.RecordID = Record.RecordID
AND Songs.songname LIKE '%suchbegriff%'
AND (Record.Jahr >= 2000 OR Record.Jahr <= 2006)
ORDER BY Record.titel, Songs.songname

MYSQL erwartet, dass datenbanken und feldnamen überall gleichgeschrieben sind.
(abfrage wurde getestet)

gruß
clipper
 
Wenn ein Song auf mehreren Records vorkommt hast Du ein Problem.
Der ursprüngliche Aufbau ist da besser.

Gruß
Deadfrog_de

Das war ein Grund, warum ich es so gelöst habe. Weiterhin muss ich ab und zu weitere Information hinzugeben, weshalb auch ein Feld Kommentar gibt.

Der nächste Punkt: Die Songs werden auch Konzerten zugordnet, es gibt also auch eine Tabelle "song2concert". Hier hatte ich es gelöst wie von clipper vorgeschlagen, baue es aber derzeit um, da ich sonst nicht in der Lage bin, Hinweise zu einzelnen Songs zu geben, die nur ein spezielles Konzert betreffen.
 
Hallo Klemens,

wenn ich Dich richtig verstanden habe, könnte die Lösung so aussehen:
SQL:
select r.titel, s.songname 
from records r, songs s, song2record sr 
where s.songID = sr.fk_songID and r.recordID = sr.fk_recordID 
and @lower(s.songname) like '%day%' 
and (r.erscheinungsjahr = 2002 or r.erscheinungsjahr = 2003) 
order by r.titel, s.songname
Gruß, Sparks

Hi Sparks,

habe es eingebaut, es funktioniert! Super. Herzlichen Dank für die schnelle Hilfe und die Nachhilfe.

Gruß
Klemens
 
Zurück