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");
非常感谢任何帮助。
答案 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。