2011-09-17 5 views
0

MySQL은 "table_a"이 3 개의 테이블을 어떻게 가입시킬 수 있습니까?

+----+-------+ 
| id | title | 
+----+-------+ 

가 지금은 검색과 같이 할 수는 :

$term = mysql_real_escape_string($_GET['term']); 

mysql_query("SELECT * FROM `table_a` 
WHERE MATCH(`title`) AGAINST('$term' IN BOOLEAN MODE) LIMIT 0,5"); 

그러나 나는 다른 compontent을 추가 할 수 있습니다.

MySQL은 "table_b"

+----+----------+ 
| id | category | 
+----+----------+ 

MySQL은 "table_c"그래서

+------------+------------+ 
| table_a_id | table_b_id | 
+------------+------------+ 

, 나는 table_a 따라 연결되어 table_b의 특정 category에 대한보고 싶어요 ~ table_c.

하지만, 그것은 항상 categorytable_a에 연결되어있는 경우가 아니라 (그래서 그냥 table_a에 연결되어 table_c의 모든 항목이없는 경우가 발생할 수있다).

, 나도 table_atitle에 대한 검색 할 수있는 category 연결 table_a 에있는 경우 또는 categorytable_b (그래서 모두가 가능해야한다에, 그래서 category shouldn title 또는 그 반대 방향). 그러나 이것이 가능하지 않다면 titlecategory을 덮어 씁니다. 여기

는 지금까지 해낸하지만 문제는

A)는 그냥

$term = mysql_real_escape_string($_GET['term']); 

mysql_query("SELECT a.*, LEFT JOIN (SELECT c.table_a_id FROM table_b AS b 
, table_c AS c WHERE b.category = '$term' AND b.id = c.table_b_id) 
AS d ON d.table_a_id = a.id FROM table_a AS a 
WHERE MATCH(a.title) AGAINST('$term' IN BOOLEAN MODE) LIMIT 0,5"); 
을 설명했던대로 그것은 title OR category를 포함하지 않는다)

B를 작동하지 않는 것입니다

도움이 되었다면 크게 감사하겠습니다.

+0

PHP 코드를 읽지 않아도됩니다 :'$ _GET [term]'을 이스케이프해야합니다. 이렇게 사용하지 마십시오. – Till

+0

@Till 난 그냥 위의 코드에 포함되지 않았습니다. 하지만 고마워;) 내 질문을 업데이 트됩니다. –

+0

여러 범주를 제목에 적용 할 수 있습니까? –

답변

0

당신은 실제로 table_b와 table_c 데이터를 함께 참여시키고 그것에 대해 왼쪽 조인을 수행하려고합니다. 이 같은 것이 당신을 위해 일해야합니다. 일치하는 항목 항목이 여러 개있는 경우. *. *의 데이터 만 필요하기 때문에 중복 레코드가 생깁니다. . 디버깅을 위해 내가 어떤이있는 경우는 중복이 왜 볼 수 있도록뿐만 아니라 * D를 추가 : 당신이 테스트 이외의 다른 일을하는 경우,

SELECT a.* 
from table_a a 
     LEFT JOIN (SELECT c.table_a_id, b.category 
        from table_b b, 
         table_c c 
        where c.table_b_id = b.id) d 
        on  a.id = d.table_a_id 
WHERE d.category = '$_GET[term]' 
or MATCH(a.title) AGAINST('$_GET[term]' IN BOOLEAN MODE) 
LIMIT 0,5 

을, 당신은 절대적으로 $ _GET을 탈출해야 용어 또는 더 나은 매개 변수화 된 SQL 사용. 준비된 문 작성에 익숙하지 않은 경우 this StackOverflow answer을 참조하십시오.

+0

그것은 아름답게 작동했습니다. 고마워, dlawrence! 하지만 네, 그냥 테스트를 위해, 그렇지 않으면 나는 mysql_real_escape_string을 포함 시켰을 것이다. 그러나 어쨌든 그것을 지적 해 주셔서 감사합니다. –

관련 문제