2012-04-05 4 views
2

저는 여전히 SQL을 사용하려고합니다. filter_thread ('filter_id'및 'thread_id'열 포함) 테이블과 필터 ('filter_id 및'tag ') 테이블'에서 thread_id를 꺼내는 쿼리를 작성했습니다.동일한 쿼리에서 INNER JOIN을 두 번 사용하십시오.

그런 다음 완전히 다른 쿼리를 사용하여 thread_id를 포함한 thread 테이블의 내용

나는 이것이 최선의 방법은 아니지만 성공적인 쿼리를 얻을 수 없다는 것을 알고 있습니다. 누구든지 도울 수 있을까요?

$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 둘 다에서 발견 된 중복 문구를 공유한다면 그것이 일어난다 고 가정한다. 왜 이런 일이 일어날 지 모릅니다. –

+0

아니요, 그렇게해서는 안된다고 생각한다면,'filter_thread' 테이블에 같은 thread_id를 가진 레코드가 여러 개 있거나'filter_id'를 가진'filter' 테이블에 여러 레코드가 있기 때문입니다. 이러한 중복 레코드가 예상되지만 결과 세트에 포함시키지 않으려면 중복을 제거하기 위해'DISTINCT' 키워드를 추가하십시오 ('SELECT DISTINCT t. * ...') – gonsalu

+1

감사합니다. 그들은 내가하고 싶은 일에 기대되고 필요합니다. DISTINCT는 완벽하게 작동했습니다. 새로운 것을 배우는 것을 좋아합니다. –

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를 반환보십시오 –

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 
관련 문제