2011-01-16 12 views
0

Hallo Ich habe eine App, die Posts, Tags und eine Tag_ref Link-Tabelle hat. Ich möchte nach Posts suchen, die eine bestimmte Tag-Zuordnung haben.SQL: Hilfe mit SQL Joins

Die Datenbankstruktur ist wie folgt:

Beiträge

ID

tags_ref

row_id

Tabelle

tag_id

Tags

id

safe_tag

Tag

Meine Frage geht im Grunde, wenn $ safe_tag nicht null ist dann tags_ref beitreten auf post.id = tags_ref.row_id Fügen Sie Tags zu tags_ref.tag_id = tags.id hinzu, wobei tags_ref.table = 'posts' und tags.safe_tag = 'food' und post.city_id = 2

Ist diese Abfrage korrekt? Benutze ich den richtigen Join-Typ?

SELECT * 
FROM (`posts`) 
INNER JOIN `tags_ref` ON `posts`.`id` = `tags_ref`.`row_id` 
INNER JOIN `tags` ON `tags_ref`.`tag_id` = `tags`.`id` 
WHERE `tags_ref`.`table` = 'posts' 
AND `tags`.`safe_tag` = 'food' 
AND `posts`.`city_id` = '2' 

Ich bekomme seltsame Ergebnisse, die überhaupt keine Tags zugeordnet haben.

Dank

+0

Warum zitieren Sie alle Tabellen- und Spaltennamen? Meinst du die city_id-Einschränkung? – Oded

+0

@Oded, es ist ein Ausdruck von Codeigniter Profiling-Funktion – iamjonesy

Antwort

1

Dies wird nur die Ergebnisse aus dem posts Tisch zurückkehren, wie zu alle Spalten in den Tabellen beitreten gegenüber. Ich habe die city_id Einschränkung entfernt, die Sie nicht in Ihrer Frage Text angegeben haben (und die war in Ihrer Anfrage):

SELECT P.* 
FROM posts AS P 
    INNER JOIN tags_ref AS TR ON P.id = TR.row_id 
    INNER JOIN tags AS T ON TR.tag_id = T.id 
WHERE TR.table = 'posts' 
AND T.safe_tag = 'food' 

ich auch Tabellen-Aliases und entfernt die Angabe hinzugefügt habe.

Wenn Sie keine Ergebnisse erhalten, das würde mir vorschlagen, dass es keine Beiträge mit den food.

+0

Ihre Abfrage funktioniert, obwohl ich eine city_id Einschränkung haben möchte. Jeder Beitrag hat ein city_id-Feld, das nicht null ist. Was ist der Unterschied zwischen deiner Anfrage und meiner? Ich kann nichts außer den Alisasen sehen – iamjonesy

+0

@iamjonesy - Nicht anders, abgesehen von den oben genannten differenziert. Wenn Ihre 'city_id' jedoch ein Ganzzahl-Typ ist, sollten Sie sie ohne Anführungszeichen abfragen:' AND P.city_id = 2'. Wenn das immer noch nicht funktioniert, überprüfen Sie Ihre Daten. – Oded