2012-04-05 19 views
2

Ich bin immer noch versucht, den Hang von SQL zu bekommen. Ich baute 1 Abfrage, die thread_id's aus einem filter_thread (enthält 'filter_id' und 'thread_id' Spalten) Tabelle und einen Filter ('filter_id und' tag ') Tabelle'Verwendung von INNER JOIN zweimal in der gleichen Abfrage

Dann verwende ich eine völlig andere Abfrage zu finden der Thread-Tabelleninhalt, der die 'thread_id' enthält

Ich weiß, dies ist nicht der beste Weg, es zu tun, kann aber keine erfolgreiche Abfrage erhalten. Würde jemand helfen können?

$query = "SELECT ft0.thread_id 
FROM filter f0 
INNER JOIN filter_thread ft0 ON ft0.filter_id = f0.filter_id 
WHERE f0.tag LIKE '%filter1%' 
OR f0.tag LIKE '%filter2%'" 
$result = $query->result_array(); 
$thread = array(); 
foreach ($result as $thread_id) 
{ 
    $id = $thread_id['thread_id']; 
    $query = $this->db->query("SELECT * FROM thread WHERE thread_id='$id'"); 
    $thisRow = $query->result_array(); 
    array_push($thread, $thisRow[0]); 
} 

DANKE!

Antwort

5

Sie können es in einer einzigen Abfrage tun, etwa so:

SELECT t.* 
    FROM filter AS f0 
INNER JOIN filter_thread AS ft0 
    ON ft0.filter_id = f0.filter_id 
INNER JOIN thread AS t 
    ON ft0.thread_id = t.thread_id 
WHERE f0.tag LIKE '%filter1%' 
    OR f0.tag LIKE '%filter2% 
+0

gut funktioniert.. Vielen Dank. Das einzige Problem ist, dass einige der Ergebnisse doppelt vorhanden sind. Ich nehme an, es passiert, wenn sie eine doppelte Phrase teilen, die in filter1 und filter2 gefunden wurde. Irgendeine Idee, warum das passieren könnte? –

+0

Nein, wenn Sie denken, dass das nicht passieren sollte, liegt es entweder daran, dass mehrere Datensätze in der 'filter_thread'-Tabelle mit der gleichen' thread_id' vorhanden sind, oder mehrere Datensätze in der 'filter'-Tabelle mit derselben' filter_id'. Wenn diese doppelten Datensätze erwartet werden, aber Sie nicht in der Ergebnismenge möchten, können Sie ein 'DISTINCT'-Schlüsselwort hinzufügen, um die Duplizierung zu eliminieren (' SELECT DISTINCT t. * ... ') – gonsalu

+1

danke. Sie sind erwartet und notwendig für das, was ich versuche zu tun. DISTINCT hat perfekt funktioniert. liebe neue Dinge zu lernen. –

1
select t.x, t.y, ... from thread t 
inner join filter f on f.thread_id = t.thread_id 
inner join filter_thread ft on ft.filter_id = f.filter_id 
where bla bla 

Mit vielleicht einige Gruppe von ...?

+0

Diese immer noch nur die Thread-ID zurückgegeben, wenn ich es in setzen –

1

Versuchen Sie, diese

SELECT t.*, f0.* 
FROM filter f0 
INNER JOIN filter_thread ft0 ON ft0.filter_id = f0.filter_id 
INNER JOIN thread t ON t.thread_id = ft0.thread_id 
WHERE f0.tag LIKE '%filter1%' 
OR f0.tag LIKE '%filter2%'" 
GROUP BY f0.filter_id