【问题标题】:Searching php + mysql close words?搜索 php + mysql 关闭词?
【发布时间】:2013-02-27 20:57:28
【问题描述】:

首先对不起我的英语......

我在数据库中有一个标签字段,我正在搜索

SELECT * FROM table WHERE tags LIKE '%$keyword%' and tags LIKE '%$keyword%'

我用空格分隔标签;

 america  england  france 

我想向你展示我的表结构

id | title | tags

1    title1  america france
2    title2  american english
3    title3  england  french

例如当我想搜索“美国”时

结果是 title1 和 title2 因为 americaamerican 标签看起来一样 词..

我怎样才能使它们独一无二?当我搜索 America 时,结果应该只有 title1...

感谢您的帮助,希望您能理解我的问题。祝您有愉快的一天

编辑:

感谢 Akam 他编写了解决方案

【问题讨论】:

  • 你可以简单地使用tags like 'keyword %'加一个空格?
  • 谢谢你的工作。祝你有美好的一天
  • 这是一个糟糕的表结构。你应该规范化设计。每个标签在其 OWN 记录中。

标签: php mysql search tags


【解决方案1】:

你可以使用这样的东西:

SELECT *
FROM tbl
WHERE CONCAT(' ', tags, ' ') LIKE CONCAT('% ', 'america', ' %')

请看小提琴here

【讨论】:

  • 如果相关标签位于字段的开头或结尾,没有前导/尾随空格,则会失败。
  • @MarcB 我在 LIKE 的两边添加了一个前导/尾随空格,我认为它不会失败
【解决方案2】:

您也可以使用 MySQL 的 REGEXP 而不是 LIKE,使用单词边界修饰符来仅匹配整个单词。您的查询将如下所示:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword[[:>:]]';

如果您需要,这还有一个额外的好处,就是让您可以在单个查询中查找与给定标签集的任何(或全部)匹配的行:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword_one[[:>:]]|[[:<:]]$keyword_two[[:>:]]'

注意 REGEXP 条件中两个表达式之间的管道 | 字符,这意味着它将匹配至少匹配其中一个标签的任何记录。

我没有亲自测试过这种方法的性能,但在其他 StackOverflow 帖子中读到它几乎等同于 LIKE 开头带有 % 通配符(因为这种类型的查询会导致 MySQL不使用索引)。所以我想这对你来说是最好的选择。

更多信息在这里:http://dev.mysql.com/doc/refman/5.1/en/regexp.html

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多