我如何加入这3张桌子?

时间:2011-09-17 21:19:03

标签: mysql

MySQL“table_a”:

+----+-------+
| 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");

但是我想添加另一个组件。

MySQL“table_b”:

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

MySQL“table_c”:

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

因此,我想根据 table_c table_a 中查找 table_b 中的特定category。< / p>

但是category table_a 相关联的情况并非总是如此(因此可能会发生没有任何条目在 table_c 中连接到 table_a )。

AND ,如果有category链接到 table_a ,我希望能够在中搜索title table_a table_b 中的category(因此两者都应该可以,因此category不应该否决title,反之亦然) 。但如果不可能,那么title应该否决category

这是我到目前为止所提出的问题,但问题是

a)它不起作用

b)它不包括我刚才解释的title OR category

$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");

非常感谢任何帮助。

1 个答案:

答案 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