尝试在PHP和MySQL中创建关键字搜索

时间:2013-12-12 18:14:59

标签: php mysql sql

我正在建立一个拥有可搜索产品数据库的网站。为简单起见,我的表有三列:

  • ID
  • img(对产品图片的引用)
  • 标签(varchar 255,用于搜索的标签列表,例如“chair wood brown”)

我有查询:

$query = "SELECT `img` FROM `products` WHERE `tags` LIKE '%$q%'";

这正是我想要的方式,唯一的问题是如果标签是在搜索的顺序中它只会选择行。例如,如果有3行:

  • 第1行标签为“黑色托盘”
  • 第2行标签为“托盘黑”
  • 第3行带有标签“黑色托盘层”

你搜索了“黑色托盘”,第1行和第3行都会显示,但不会显示第2行。

无论文字的顺序如何,我都试图显示所有三行。例如,如果您搜索“黑色托盘”,我想要显示所有内容,但如果您搜索“托盘图层”,则只会显示第3行。也许这需要重新思考原始查询,我不确定。

非常感谢!

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