【问题标题】:mysql select content around keywordmysql选择关键字周围的内容
【发布时间】:2011-06-06 22:58:15
【问题描述】:

我正在尝试创建带有关键字突出显示的搜索表单,但显然如果关键字没有出现在列表结果的前几句中,我将无法突出显示该关键字 - 所以我需要创建一个 sql 语句,它将填充找到的关键字左侧和右侧相同的字符数。

有人知道这样的 SQL 语句是什么吗?

好的——澄清一下——想象一下下面的 SQL 语句:

SELECT * 
FROM `articles`
WHERE `content` LIKE '%keyword%'

现在 - 此语句将返回与 WHERE 子句匹配的结果列表。

我接下来要做的是使用以下方法 (PHP) 将结果集的所有关键字与 span 一起包装以突出显示关键字:

public static function highlight($string = null, $keyword = null, $class = 'highlight') {
     return str_ireplace($keyword, "<span class=\"{$class}\">{$keyword}</span>", $string);
}

现在这可以正常工作了,但每个结果只显示每个结果的开头 X 个字符。

我想要实现的是先识别内容中的关键字,然后从这个关键字的左右抓取一些内容,这样关键字总是出现在每个结果中。

我希望这是有道理的。

【问题讨论】:

  • 到目前为止你有什么?

标签: mysql sql search


【解决方案1】:

这可以改进,但在我看来你正在寻找这样的东西

select *,
case
when locate('search_test',field) < 10 then substring(field,1,char_length('search_test')+10)
else substring(field from locate('search_test',field) - 10 for char_length('search_test') + 20)
end as content
from table
where field like '%search_test%'

【讨论】:

  • 谢谢你 - 我相信它已经很接近了,但由于某种原因它似乎不起作用。
  • 请您具体说明您的意思不起作用。您是否收到任何错误或根本没有得到预期的结果?查询运行没有任何错误。您必须对其进行调整以适应您对周围测试的需要。
【解决方案2】:

好的 - 我想我已经想通了 - 这是我想出的:

SELECT
IF (
    LOCATE('keyword', `content`) < 20,
    SUBSTRING(`content`, 1, 200),
    SUBSTRING(`content`, LOCATE('keyword', `content`) - 20, 200)
) AS `content`
FROM `table`
WHERE `content` LIKE '%keyword%'

首先确定关键字的位置,然后如果它的索引小于 20,我只是从头开始获取内容,如果它发生在第 20 个索引之后,那么我会抓住它的索引 minux 20 个字符和 200 个字符一起- 它有效!

谢谢尼克 - 你的回答真的很有帮助。

只剩下一件事 - 我如何从内容字段中去除 html 标签以便将它们删除 - 也许使用 REGEXP - 任何人都知道如何?

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2015-04-09
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多