| 

.NET C# Java Javascript Exception

2
Hallo,

ich hab folgendes Problem. Ich verwaltete Games die mit mehreren Tags versehen sind. Nun möchte ich die entsprechenden Games nach Tags filtern. Das Datenbanktechnisch ist das Ganze sauber mit einer Zwischentabelle gelöst und sieht wie folgt aus:
Games                GameTag                      Tag
Id | Name Id | Game_Id | Tag_Id Id | Name | Keyword
1 | AION 1 | 1 | 2 1 | Shooter | shooter
2 | BF Heroes 2 | 2 | 1 2 | MMORPG | mmorpg
3 | 1 | 3 3 | Für Mädchen | forgirls

Ein Select Statement mit Join funktioniert. Wenn ich nun aber nach Tags filtern will, bleibt die Antwort leer.

So funktioniert es bisher:
SELECT * FROM games as g 
INNER JOIN games_tags AS gt ON g.id = gt.game_id
INNER JOIN tags AS t ON gt.tag_id = t.id
ORDER BY g.id DESC


Und mit dem Where Statement nicht mehr:
SELECT * FROM games as g 
INNER JOIN games_tags AS gt ON g.id = gt.game_id
INNER JOIN tags AS t ON gt.tag_id = t.id
WHERE (t.keyword LIKE "hacknslay" AND (t.keyword LIKE "shooter" OR t.keyword LIKE "mmorpg"))
ORDER BY g.id DESC


Das Where Statement wird dynamisch mit den Filterangaben des Benutzers generiert.

Kann mir einer weiterhelfen warum das Statement nicht klappt?

Danke,
rjgamer
News:
30.09.2014
rjgamer 31 3
Ohne genauere Kenntnis der Felder zu haben: nachdem Du die Abfrage sowieso dynamisch generierst, versuche mal (Achtung, MySQL), statt 'LIKE "hacknslay"' als 'LIKE "%hacknslay%"' zu generieren.
muffi 30.09.2014
Hab nun noch die Tabellenfelder angegeben. Die Keywords (Slugs) entsprechen genau der Spalten der Tag-Tabelle.
rjgamer 30.09.2014
1 Antwort
0
Manchmal hat man Tomaten auf den Augen... hatte ich auch :-)
Du wirst so nie ein Ergebnis bekommen denn: Du fragst die Zeilen ab, in denen das Feld keyword "hacknslay" und shooter oder mmorpg sein kann. Das sollte es normalerweise nicht geben, ein Feld sollte in einer normalen, relationalen Datenbank nicht mehrere Ausprägungen haben können. Ich denke, das gewünschte Ergebnis kommt, wenn Du die Abfrage änderst in

SELECT * FROM games as g 
INNER JOIN games_tags AS gt ON g.id = gt.game_id
INNER JOIN tags AS t ON gt.tag_id = t.id
WHERE t.keyword LIKE "hacknslay" OR t.keyword LIKE "shooter" OR t.keyword LIKE "mmorpg"
ORDER BY g.id DESC

Falls die Klammer ernst gemeint war, muss das erste Feld (t.keyword LIKE "hacknslay") anders heißen. Ich vermute mal, Du wolltest diese Abfrage formulieren:

SELECT * FROM games as g 
INNER JOIN games_tags AS gt ON g.id = gt.game_id
INNER JOIN tags AS t ON gt.tag_id = t.id
WHERE (t.Name LIKE "für mädchen" AND (t.keyword LIKE "shooter" OR t.keyword LIKE "mmorpg"))
ORDER BY g.id DESC
30.09.2014
muffi 1,4k 1 9
Danke für deine Antwort. Meine Abfrage war indirekt schon richtig formuliert. Gewisse Tags zB. Shooter und MMORPG können nur entweder oder zugewiesen werden. Hacknslay und für Mädchen aber beide. Daher wird mit AND resp. OR unterschieden.
rjgamer 30.09.2014
Nachtrag: Ich verstehe nun dass ich pro Tag mehrmals die Spalte "Keyword" abfragen möchte. Muss ich da irgendwie das Join anders schreiben?
rjgamer 30.09.2014
Wenn Du die Spalte keyword nach drei verschiedenen Begriffen abfragen möchtest, müsste die von mir erstgenannte Variante funktionieren. An den Joins sehe ich im Moment kein Problem.

Schreib mal, wo das hacknslay vorkommt (ich vermute: tags.id=4, tags.keyword='hacknslay', tags.name='Pack die Kettensäge aus'), das würde aber zu meiner ersten Variante passen. Heute komm ich leider nicht mehr zum Antworten, ich bemühe mich aber morgen.

Tipp: anstelle von OR-Orgien kann man auch WHERE t.keyword IN ('hacknslay','shooter','mmorpg') verwenden.
muffi 30.09.2014
Hacknslay, wie auch Forgirls als Keywords können beide vorkommen. Daher das AND. MMORPG und Shooter aber nur einmal.
rjgamer 30.09.2014
Ich denke, jetzt habe ich verstanden, was Du vorhast. Wahrscheinlich wirst Du aber nicht um eine Unterabfrage rumkommen. Versuch mal dieses:

SELECT * FROM games as g
INNER JOIN gametag AS gt ON g.id = gt.game_id
INNER JOIN (select * from tags where keyword in ('shooter','mmorpg')) AS t ON gt.tag_id = t.id
ORDER BY g.id DESC
muffi 01.10.2014

Stelle deine Sql-Frage jetzt!