2011-09-17 15 views
0

MySQLの "table_a":私は別のcompontentを追加するしかしこれらの3つのテーブルを結合するにはどうすればよいですか?

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

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

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

今、私はそうのような検索を行うことができます。

MySQLの "table_b":

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

MySQLの "table_c":だから

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

、私はtable_a応じにリンクされているtable_bに特定categoryを探したいです〜table_c

しかし、それは(それだけでtable_aに接続されているtable_cのいずれかのエントリが存在しないことが起こりことができるように)categorytable_aにリンクされていることを必ずしもそうではありません。

、私はどちらかtable_atitleを検索できるようにしたいcategoryリンク table_a に存在する場合やcategorytable_b(その両方が可能であるべきで、そうcategory shouldn title、またはそれ以外の方法で上書きしてください)。しかしそれが不可能ならば、titlecategoryを覆うべきです。

は、ここで私は今のところ思い付いたのですが、問題は、a)は、それが

bは動作しません

である)私はちょうど

$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が含まれていません。

ご協力いただければ幸いです。

+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'をインクルードしましたが、とにかくそれを指摘してくれてありがとう。 –

関連する問題