[MySQL] Doppelte Datensätze in Abfrage mit Inner Join

Icevarta

Grünschnabel
Hallo
ich schreibe im Moment eine Fotodatenbank für unsere Schule, bei der Suchfunktion habe ich aber noch einige Probleme. Erst mal die wichtigen Tabellen:


fotos

FotoID int Primärschlüssel
Pfad Text
PfadVorschau Text


tagpos

FotoID int
TagID int


tags

TagID int Primärschlüssel
Tag Text


Um eine Suche durchzuführen habe ich folgenden SQL-Befehl:

Code:
SELECT fotos.PfadVorschau, tags.tag
FROM fotos
INNER JOIN tagpos
ON fotos.FotoID = tagpos.FotoID
INNER JOIN tags
ON tagpos.TagID = tags.TagID'
WHERE tags.Tag LIKE "%Suchbegriff'%"

Wenn jetzt aber ein Foto z.B. die Tags Schulfeier und Schulgebäude hat und man nach „Schul“ sucht wird das Bild doppelt ausgegeben. Dies lässt sich auch nicht mit DISTINCT unterdrücken. Gibt es dazu eine Lösung in MySQL?

Vielen Dank im vorraus
Icevarta
 
Da du die Tags im SELECT hast geht DISTINCT nicht.

Du kannst die Tags in eine Zeile Zusammenfassen mit GROUP_CONCAT in einem GROUP-Statement.

Ich haber auch gleich noch den Rest umgebaut, so dass zuerst die ID gefiltert wird und erst dann die Daten aus der Foto-Tabelle dazukommen. Wenn die Indexe auf den IDs in tagpos und tags gesetzt sind, sollte dies eine gute Performance abgeben

Code:
SELECT 
	fotos.PfadVorschau, 
	GROUP_CONCAT(DISTINCT tags.tag ORDER BY tags.tag SEPERATOR ", ")
FROM fotos
WHERE FotoID IN (SELECT tagpos.FotoID
					FROM tagpos INNER JOIN tags ON tagpos.TagID = tags.TagID
					WHERE tags.Tag LIKE "%Suchbegriff'%")
GROUP BY fotos.PfadVorschau
 
Zuletzt bearbeitet:
Hallo
Der SQL-Befehl ist leider ein Fehler drin:
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEPERATOR ", ") FROM fotos WHERE FotoID IN (SELECT tagpos.FotoID FROM tagpo' at line 3

Hab mit SEPERATOR und Unterabfragen noch nie gearbeitet deshalb find ich da selber nichts.
Und in der Tabelle fotos hab ich noch zusätzliche Spalten (Bewertung, KategorieID, AnzahlDownloads) wenn ich die auch Ausgeben will kämen die hinter SELECT fotos.PfadVorschau, Bewertung … ?
Dankeschön für deine Mühe
 
Abschreiben müsst ich können - Seperator anstelle Separator. Nunja.

Ich hab hier das SQL so zusammengestellt, das es einfacher zu lesen ist (also ohne Subqueries)

Code:
SELECT 
	fotos.Pfad,
	fotos.PfadVorschau, 
	GROUP_CONCAT(DISTINCT tags.tag ORDER BY tags.Tag SEPARATOR ', ') AS taglist
FROM 
	fotos,
	tagpos, 
	tags
WHERE
	tags.TagID = tagpos.TagID  
	AND tagpos.FotoID = fotos.FotoID
	AND tags.Tag LIKE '%Suchbegriff%'	
GROUP BY fotos.PfadVorschau

Die restlichen Felder aus fotos kannst du einfach mit Komma getrennt im SELECT-Teil hinzufügen
 
Zurück