JOIN Problem mit Tags
Thomas E.
- php
Hallo Community,
also erst einmal meine bishere MySQL-Query:
-----------------------------------------------
SELECT knn_information.information AS information FROM knn_information
JOIN knn_tagged ON knn_tagged.information = knn_information.id
JOIN knn_tags ON knn_tags.id = knn_tagged.tag
WHERE knn_tags.tag = '$keyword'
-----------------------------------------------
ich habe Informationen in knn_information gespeichert und Tags in knn_tags. Verbunden sind die beiden Tabellen über knn_tagged wo das Feld information auf die ID von den Informationen verweist und tag auf die ID von den Tags.
Solange nur ein Tag mit der Information verknüpft ist, klappt alles wunderbar. Wenn ich nun aber mehrere Tags habe klappt das ganze nicht mehr.
Beispiel:
WHERE knn_tags.tag = '$keyword1' AND knn_tags.tag = '$keyword2'
Ich hoffe, ihr könnt verstehen was ich meine und mir helfen! :)
Mit freundlichen Grüßen,
Thomas E.
Hallo Thomas,
> SELECT knn_information.information AS information
> FROM knn_information
> JOIN knn_tagged
> ON knn_tagged.information = knn_information.id
> JOIN knn_tags
> ON knn_tags.id = knn_tagged.tag
> WHERE knn_tags.tag = '$keyword'
Solange nur ein Tag mit der Information verknüpft ist, klappt alles wunderbar. Wenn ich nun aber mehrere Tags habe klappt das ganze nicht mehr.
Was heißt: "Klappt nicht mehr"?
Beispiel:
WHERE knn_tags.tag = '$keyword1' AND knn_tags.tag = '$keyword2'
a) Wenn $keyword1 ungleich $keyword2 ist, dann _muss_ die Ergebnismenge leer
sein. Wahrscheinlich möchtest Du den OR-Operator verwenden, noch schöner
wäre die Verwendung von IN:
WHERE knn_tags.tag IN ('$keyword1', '$keyword2')
b) zu PHP:
Falls Deine Keywords aus Benutzereingaben stammen, so solltest Du diese mit
mysql_real_escape_string() behandeln, um SQL-Injection zu vermeiden.
(adäquate Mechanismen bei mysqli oder PDO böten sich auch an :-))
Freundliche Grüße
Vinzenz
Super Lösung. Vielen Dank, klappt genau wie es soll.
mysql_real_escape_string() ist schon drinnen - aber danke für den Tipp! ;)
Thomas E.
Nachtrag:
Leider holt die Abfrage nun die Einträge aus der DB doppelt ab. Ich möchte jede Information jedoch nur ein mal anzeigen. Entschuldigung, dass ich direkt noch einmal schreibe...
Thomas E.
Hallo Thomas,
Leider holt die Abfrage nun die Einträge aus der DB doppelt ab. Ich möchte jede Information jedoch nur ein mal anzeigen.
das wiederum kann durchaus am Join liegen. Es ist normal, dass es zu einem Datensatz mehrere passende in der anderen Tabelle gibt, d.h. die Einträge könnten sogar öfter als doppelt vorkommen.
Dir sollte das Schlüsselwort [link:http://dev.mysql.com/doc/refman/5.0/en/select.html#id4828661@title=DISTINCT]
weiterhelfen:
SELECT DISTINCT
spaltenliste
FROM
tabelle
Freundliche Grüße
Vinzenz