【问题标题】:Select rows where column text contains value of an array选择列文本包含数组值的行
【发布时间】:2011-03-26 13:08:26
【问题描述】:

我正在 php/mysql 中构建搜索功能,并且正在寻找正确的 MySql 功能。我的表格看起来像这样:

id    | text
-------------------------------------- 
1     | I like pony's.
2     | Do you like fish?
3     | We like fishes!

我想在“文本”列中搜索一个数组的确切值,例如:

$search_array = array('fish','dogs','cat','panda');

我正在寻找正确的 MySql 函数以仅返回第二行(使用当前数组)。该数组可以包含数百个值。

我有 6000 多行,每天以 +/- 400 的速度增长。我尝试过 REGEXP,但对于一个大数组,它需要大约 10 秒才能返回相应的行。

请帮忙,我已经为此奋斗了将近 3 天...提前致谢!

【问题讨论】:

  • 这些数据是什么?这种搜索的目的是什么?可能还有另一种方法来做到这一点
  • 您可能会发现以下问题很有帮助:stackoverflow.com/questions/1568068/…
  • 好吧,文本列实际上包含推文。我想创建某种类别:每个类别都是一组关键字。如果推文包含关键字之一,则应选择它们。这样说清楚了吗?

标签: php mysql regex arrays match


【解决方案1】:

如果搜索数组是恒定的,或者不经常更改,我建议再使用两个表,“tags”和“tags-text”。

例如,您的示例中 id 为 2 的行包含 fish,因为 fish 在我们的“tags”表中,一条新记录将被放置在“tags-text”表中。当您使用数组进行搜索时,您可以搜索数组组件之一是否在“tags-text”表中,然后加入“text”表并返回文本和 id 并执行您需要的任何操作。

其他表的结构:

'标签'表

id    | tags
-------------------------------------- 
1     | fish
2     | dogs
3     | cats

'标签-文本'表

text-id  | tags-id
-------------------------------------- 
2        | 1

这有帮助/有意义吗

【讨论】:

  • +1 表示关注的不是问题,而是常识
  • 如果他的数据变成逗号分隔的集合,我不会感到惊讶
  • 没错:逗号分隔或由|分隔
  • @bEN 什么是逗号分隔的数据?你不是说是微博吗?无论如何,这个答案最符合您的需求
  • 是的,它是推文。我确实有另一个带有关键字的表格,它是用逗号分隔的。抱歉,不清楚。
【解决方案2】:

好的,我想我找到了最简单的解决方案:让 PHP 创建 mysql 查询并使用 WHERE LIKE 解决它。

$search_array = array('fish','dogs','cat','panda');

$string = '';

foreach($search_array as $term) {
    $string = $string."text LIKE '%".$term."%' AND ";
}

foreach 循环的结果是:

"text LIKE '%fish%' AND LIKE '%dogs%' AND LIKE '%cat%' AND LIKE '%panda%' AND "

现在让我们删除该字符串的尾部并编写查询:

$string = substr($string, 0, -5); // removing " AND " at the end of the string

$query = "SELECT * FROM table WHERE $string";
$results = mysql_query($query);

无论如何感谢其他答案:)

【讨论】:

    【解决方案3】:

    好吧,也许你应该尝试混合一下 mysql 和 php。 这是伪代码

    从 db 一次选择 100-1000 行 使用 strpos 对照文本列检查数组中的每个元素 如果找到元素 存储它 如果找到 2 个元素打破循环 别的 继续

    【讨论】:

    • 他只想要两行,如果数组很大,循环只需处理几次
    • 他应该说(第二行..)不是第 2 行
    【解决方案4】:

    可能是这样的......

    $search_term = implode(",",$search_array);
    SELECT * FROM your_table WHERE text IN ($search_term)";    
    

    【讨论】:

    • 如果你使用 IN,那么 'text' 应该精确匹配数组的值之一,对吧?
    • 是的,我相信你是对的,这个怎么样。 select * from your_table where text REGEXP 'fish|dogs|cat';您需要相应地操作您的数组,以便它正确插入到 SQL 语句中。
    • 嗯嗯,这就是我一开始尝试的。随着正则表达式字符串变长,不知何故需要几秒钟的时间来搜索..
    • 您看到某人在评论中发布的链接了吗?你原来帖子下的那个,也许有帮助?
    • 是的,选择的答案是全文搜索。这就是我现在实际使用的,但它不符合我的需求:我在寻找完全匹配时按相关性排序结果 - 或不匹配..
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多