匹配字符串

时间:2016-10-24 16:19:55

标签: php mysql regex

  • 我有一个MySQL表,可以为用户提供问题。
    • 每个用户都分配了一个类别。
    • 每个问题都可以定位一个或多个用户类别。
    • 问题类别位于问题表的列中,并且 不在单独的表格中。
    • 对于定位多个用户类别的问题,每个类别将由|
    • 等字符分隔

我试图从表格中获取特定用户的类别与问题的类别列中的字符串匹配的所有问题。

我遇到了几个问题:

$string^无效,因为我尝试与之比较的字符串可能类似于Retail|Field Based

我无法使用WHERE category LIKE "%'.$category.'%"因为某些类别 分享单词。例如:RetailRetail Roadshow如果Retail是类别,它也会匹配Retail Roadshow

我对如何使用当前数据库结构执行此操作感到有点失落。我不打算改变数据库的结构,但如果我无法得到目前工作方式的工作答案,我可能不得不这样做。

2 个答案:

答案 0 :(得分:2)

您有三种选择:

1)将通配符匹配拆分为单字业务:

foo LIKE '%bar baz%' - > foo LIKE '%bar%' AND foo LIKE '%baz%'

2)使用全文索引

foo like '%bar baz%' - > MATCH(foo AGAINST 'bar baz')

3)或规范化您的表,以便每个关键字都是自己的子记录:

JOIN keywords ON ...
WHERE keywords.word IN ('bar', 'baz')

答案 1 :(得分:0)

正如其他人已经提到的,数据库最适合表格。

但是为了争论,让我们看看如何在没有任何数据库重构的情况下实现目标。

首先,您需要用逗号替换所有管道。

replace(column, '|', ',')

现在在结果上使用find_in_set:

find_in_set('Retail', replace(column, '|', ','))

MySQL索引以1开头,因此您可以检查Rrtail是否存在于以下列中:

find_in_set('Retail', replace(column, '|', ',')) > 0