2012-04-05 184 views
2

我仍然试图获取SQL的挂件。我构建了一个查询,它从filter_thread(包含'filter_id'和'thread_id'列)表和一个过滤器('filter_id和'tag')表中取出thread_id's'在同一查询中使用INNER JOIN两次

然后,我使用完全不同的查询来查找线程表的内容,其中包含'thread_id'。

我知道这不是最好的办法,但无法获得成功的查询。任何人都可以提供帮助吗?

$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]); 
} 

谢谢!

回答

5

你可以做一个单一的查询,像这样:

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

效果很好。谢谢。唯一的问题是一些结果重新复制。如果他们共享在filter1和filter2中找到的重复短语,我认为它会发生。任何想法为什么这可能会发生? – 2012-04-05 17:28:04

+0

不,如果您认为不应该发生,则可能是因为'filter_thread'表中有多个相同'thread_id'的记录,或者'filter_id'中的多个记录存在'filter_id'。如果预期这些重复记录,但您不希望它们放在结果集中,则可以添加一个“DISTINCT”关键字以消除重复(SELECT DISTINCT t。* ...') – gonsalu 2012-04-05 17:33:56

+1

谢谢。他们是预期的,并且是我想要做的事情所必需的。 DISTINCT非常完美。爱学习新事物。 – 2012-04-05 17:37:41

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 

也许有些群由......组成?

+0

这仍然只返回线程ID,当我把它放在 – 2012-04-05 17:28:35

1

试试这个

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