1

是否可以进行通配符搜索,并提取通配符的值并将它们放入 MySQL 结果中?最好,我还想标记通配符。继续阅读以了解我的意思。

示例: 考虑具有以下结构的数据库表。

+----+-------------------+
| id | content           |
+========================+
| 1  |  %1.%2.%3         |
+----+-------------------+
| 2  |  Hey %name.       |
+----+-------------------+

首先,请注意这只是一个示例。我没有在单个数据库字段中存储多个值。请参阅此处:在数据库列中存储分隔列表真的那么糟糕吗?

相反,我想知道是否可以在数据库中使用通配符,然后将其与用户输入进行比较。换句话说,我想接受用户输入,例如2.bla.^7或类似的,然后返回相应的行--%.%.%。然后我想采用这些通配符,并将它们作为 MySQL 结果的一部分返回。mysql_fetch_assoc()下面是一个基于我正在寻找的示例 PHP结果。结果显然不需要完全像这样布置,但这我正在寻找的结果。

例子:

/************************
 * Input:    2.bla.^7   *
 ************************/
Array
(
    [0] => Array
    (
        [id] => 1,
        [content] => %1.%2.%3
    ),

    [1] => Array
    (
        [1] => 2,
        [2] => bla,
        [3] => ^7
    )
)

/************************
 * Input:   Hey Matt.   *
 ************************/
Array
(
    [0] => Array
    (
        [id] => 2,
        [content] => Hey %1.
    ),

    [1] => Array
    (
        [name] => Matt
    )
)

我知道我正在寻找的东西可能相当复杂,或者专门针对我的独特案例。如果您能指出我正确的方向,我将不胜感激!我什至不知道这是否可能 - 如果不是,将不胜感激替代解决方案!但是,我希望数据库结构尽可能接近相同。

非常感谢!

4

2 回答 2

2

你不只是想做:

SELECT * FROM patterns WHERE 'user input' LIKE content;

sqlfiddle上查看。

于 2012-05-21T23:04:09.953 回答
1

事实上,没有现成的解决方案。这是我要做的:

1) 添加 3 个特殊列like_pattern,regexp_patternplaceholders. content它们的值是在将数据加载到表之前在 PHP 中或在插入/更新触发器之前从列中计算出来的。

  • like_pattern VARCHAR(N)- 反向搜索的 LIKE 模式
  • regexp_pattern VARCHAR(N)- 用于稍后在 PHP 中提取部分的正则表达式模式
  • placeholders VARCHAR(N)- 逗号分隔的占位符名称列表

这是示例:

+----+-------------+--------------+--------------------+--------------+
| id | content     | like_pattern | regexp_pattern     | placeholders |
+====+=============+==============+====================+==============+
| 1  |  %1.%2.%3   | %.%.%        | ^(.*)\.(.*)\.(.*)$ | 1,2,3        |
+----+-------------+--------------+-+------------------+--------------+
| 2  |  Hey %name. | Hey %.       | ^Hey (.*)\.$       | name         |
+----+-------------+--------------+--------------------+--------------+

2) 对于给定的字符串搜索记录,使用like_pattern

SELECT * FROM patterns WHERE 'Hey Nathanael.' LIKE like_pattern;

请注意,简单索引无法加速此查询,因为我们执行反向搜索,因此根据您的表有多大,您可能需要不同的解决方案。

3) 匹配字符串“Hey Nathanael”。反对regexp_pattern使用 PHPpreg_match()ereg(). 您将获得占位符值。

4) 将它们与列中的占位符名称结合起来placeholders

就是这样。

于 2012-05-26T04:03:11.970 回答