我正在建立一个拥有可搜索产品数据库的网站。为简单起见,我的表有三列:
我有查询:
$query = "SELECT `img` FROM `products` WHERE `tags` LIKE '%$q%'";
这正是我想要的方式,唯一的问题是如果标签是在搜索的顺序中它只会选择行。例如,如果有3行:
你搜索了“黑色托盘”,第1行和第3行都会显示,但不会显示第2行。
无论文字的顺序如何,我都试图显示所有三行。例如,如果您搜索“黑色托盘”,我想要显示所有内容,但如果您搜索“托盘图层”,则只会显示第3行。也许这需要重新思考原始查询,我不确定。
非常感谢!
答案 0 :(得分:3)
你需要使用功能更强大的MATCH AGAINST
。此外,您可以将其全部索引并提高速度。
请参阅以下页面:
答案 1 :(得分:2)
可能为时已晚,但如果可能的话,请以下列形式为您的代码使用另一个表:
product_id | tag
1 | black
1 | tray
2 | tray
2 | black
3 | black
3 | tray
3 | layer
这将允许您使用以下内容查找作为一个或多个标记的任何产品:
SELECT DISTINCT products.*
FROM products LEFT JOIN tags ON tags.product_id = products.id
WHERE tags.tag IN ('black', 'red', 'light')
修改强>
如果您希望所有代码都存在,则必须向x标签发出x查询以使用此代码进行搜索:
SELECT *
FROM
(SELECT DISTINCT products.*
FROM products LEFT JOIN tags ON tags.product_id = products.id
WHERE tags.tag = 'black') AS set_a
INNER JOIN
(SELECT DISTINCT products.*
FROM products LEFT JOIN tags ON tags.product_id = products.id
WHERE tags.tag ='red') AS set_b ON set_a.product_id = set_b.product_id
INNER JOIN
(SELECT DISTINCT products.*
FROM products LEFT JOIN tags ON tags.product_id = products.id
WHERE tags.tag = 'light') AS set_c ON set_b.product_id = set_c.product_id
这将与找到的所有记录相交,只留下潜在的记录。请注意,这是一个非常繁重的请求,我不知道是否在MySQL中实现了INTERSECT关键字,这是一个更好的方法,我敢肯定!
答案 2 :(得分:0)
我建议将单字标记存储在单独的关系(表格)中,并且:
preg_replace('\s+', "','", $q);
$query = "SELECT `img` FROM `products` LEFT JOIN `tags` USING (`id`) WHERE `tags`.`content` IN ('$q')";