2

我有一个包含文本字段的表。在这些字段中,我存储文本。每个字段大约有 20 到 50 个句子,具体取决于行。我正在使用 HTML 和 PHP 制作一个自动完成的 HTML 对象,我想开始输入单词的开头,并且数据库返回包含这些单词的句子(如 Microsoft Office 2007/2010 导航窗格)。

我需要 mysql 将这些单词或句子作为单独的结果返回,以便我可以进一步操作它们。

例子:

--------------------------------------------------------------------
| id    | title |content                                            |
--------------------------------------------------------------------
1 |  test 1    |  PHP is a very nice language and has nice features.
2 |  test 2    |  Spain is a nice country to visit and has nice language.
3 |  test 3    |  Perl isn\'t as nice a language as PHP.

我需要 mysql 查询以不同的结果返回以下内容:

1,"nice language"
1,"nice features"
2,"nice country"
2,"nice langugage"
3,"nicea a language"

这是我的sql查询:

SELECT id, SUBSTR(content,POSITION('nice' IN content),50)
    FROM entries 
          MATCH (title,entry) AGAINST ('nice' WITH QUERY EXPANSION)
4

1 回答 1

3

新答案

无关——他的问题涉及直接在 MySQL 中进行字符串操作。

字符串操作并不是 DBMS 的真正重点。在流畅的文本意义上处理“单词”时,需要大量逻辑来确定下一个单词边界在哪里,并且您不希望您的数据库真的这样做。此外,任何为此编写的查询都可能难以阅读。

这完全取决于您在做什么,但很可能只有 DB 的方法会更慢,因为会有更多的函数调用:SQL 函数非常有限。

对于可重用性和最佳实践,如果您将来想将数据库更改为 MongoDB 怎么办?您需要重新编写整个该死的尴尬查询。

不,我的建议是使用标准 MySQL 将整个值拉入 PHP,将其放入 PCRE,非常简单的正则表达式,完成工作。最好在 PHP 代码中显示您实际在做什么,因为它更“揭示意图”。

至少 33% 的开发人员的工作是为工作选择正确的工具。PHP 是本示例中的正确工具。

原始答案

您已经包含了标签,所以我猜测(尽管您的问题需要对此进行更多澄清)您显然希望这个“自动完成”在客户端运行。因此,您必须首先将数据从服务器端获取到客户端

Twitter Bootstrap 有一个很酷的东西,叫做Typeahead。这使用 JavaScript 来执行(我认为)您需要的:该页面上的示例显示了您如何键入国家/地区,它会自动为您完成。它看起来像这样:

在此处输入图像描述

你如何让这个工作?首先包含所需的 JavaScript 文件,然后编写 HTML。

以下是引导页面源代码中的一些内容,因此您可以了解它是如何工作的:

<input type="text" data-provide="typeahead" data-items="4" data-source='["Alabama","Alaska","Arizona","Arkansas","California"]'>

你能看到这个data-source属性是如何为预输入提供你想要的信息的吗?您想要连接到 MySQL,获取您的数据,并将这些数据推送到data-source数组中以便 JavaScript 使用,如上所述。

因此,在页面加载时,您连接到 MySQL 并从数据库中提取所有您希望“自动完成”的相关字符串。然后,您将这些作为预先输入的新数据属性,就是这样!

--

编辑:twitter bootstrap 的 typeahead 有一个分支,它允许 AJAX 调用,因此您可以使用它来异步执行数据检索(如果您能弄清楚,我会推荐这种方法)。

于 2013-04-11T08:26:58.433 回答