【问题标题】:Selecting multiple substrings from a field in MySQL从 MySQL 中的字段中选择多个子字符串
【发布时间】:2015-05-21 13:22:37
【问题描述】:

我在 MySQL 中有一个 longtext 字段。我正在寻找可能在其中的任何“媒体”实例,+/- 10 个上下文字符。单行字段中通常有多个实例,所以我需要查看上下文。我怎样才能写一个查询来做到这一点?我什至想不出从哪里开始。

所以我看到的是这个:

SELECT field_data_body FROM table WHERE field_data_body LIKE '%media%';
+----------------------------------+
| field_data_body                  |
+----------------------------------+
| ... ode__media_or ... e immediat | 
+----------------------------------+

该字段实际上是一个长字符串,我只是解析了实际的测试值以显示与 WHERE 子句匹配的子字符串。

我真正想看到的是字符串media所有 个实例,在上面的示例中是两个,但在其他字段中可能更多。 SUBSTR 只显示media 的第一个实例。

【问题讨论】:

  • 我猜你需要WHERE LENGTH(mycolumn) >10
  • 你能举个例子吗?你的问题我不清楚
  • 您是否使用其他语言来处理这些数据?我不确定 SQL 是否是像这样遍历字符串的最佳解决方案。
  • 我可以使用另一种语言(真的是 PHP),但查询会更方便。
  • 您是否要搜索某些内容(例如媒体),然后为每个连接的匹配返回搜索到的表达式 +- 10 个字符(或尽可能多的,如果在开始/结束处)?

标签: mysql sql string


【解决方案1】:

CREATE FUNCTION 你自己的。在函数内部,您可以使用WHILE 语句和通用字符串函数,例如LOCATESUBSTRING

下面是一个让您入门的示例:

DELIMITER $$

CREATE FUNCTION substring_list(
    haystack TEXT,
    needle VARCHAR(100)
)
RETURNS TEXT
DETERMINISTIC
BEGIN
    DECLARE needle_len INT DEFAULT CHAR_LENGTH(needle);
    DECLARE output_str TEXT DEFAULT '';
    DECLARE needle_pos INT DEFAULT LOCATE(needle, haystack);
    WHILE needle_pos > 0 DO
        SET output_str = CONCAT(output_str, SUBSTRING(haystack, GREATEST(needle_pos - 10, 1), LEAST(needle_pos - 1, 10) + needle_len + 10), '\n');
        SET needle_pos = LOCATE(needle, haystack, needle_pos + needle_len);
    END WHILE;
    RETURN output_str;
END$$

DELIMITER ;

这里有一些测试。对于每个匹配项,返回术语(“媒体”)和两边最多 10 个字符,全部连接在一个字符串中:

SELECT substring_list('1234567890media12345678immediate34567890media1234567890', 'media');
+---------------------------+
| 1234567890media12345678im |
| 12345678immediate34567890 |
| te34567890media1234567890 |
+---------------------------+
SELECT substring_list('0media12345678immediate34567890media1', 'media');
+---------------------------+
| 0media12345678im          |
| 12345678immediate34567890 |
| te34567890media1          |
+---------------------------+

【讨论】:

  • 很棒的方法,这是一个宝石!
【解决方案2】:

在 mysql 中,您可以为此创建一个用户定义函数,例如 wordcount。您可以从此 UDF 获得帮助。

mysql count word in sql syntax

【讨论】:

    【解决方案3】:

    这是一个使用 PHP 的解决方案,它将返回每一行和每个结果以及多维数组中的周围字符。

    $value = "media";
    $surroundingChars = 5;
    $strlen = strlen($value);
    
    $stmt = $pdo->prepare("SELECT field_data_body FROM table WHERE field_data_body LIKE ?";
    $stmt->execute([ '%'.$value.'%' ]);
    $result = 0;
    while ($body = $stmt->fetchColumn()) {
        $start = 0;
        while (($pos = stripos($body, $value, $start)) !== FALSE) {
             $return[$result][] = substr($body, $pos - $surroundingChars, $strlen + ($surroundingChars * 2));
             // Adjust next start 
             $start = $pos + $strlen;
        }
        $result++;
    }
    

    您可以随时更改$return[$result][] 行,但要以您想要的格式回显所有行,您可以这样做:

    foreach($return as $row) {
        echo implode('..', $row);
    }
    

    正如您在 cmets 中所说,您更喜欢查询,但如果您改变主意,这里有一个符合您的 PHP 要求的解决方案。

    【讨论】:

    • 是的,我可以在 PHP 中做到这一点,我不想接受这个答案,因为我正在寻找一个 mysql 查询。但是,如果一段时间后没有人提出来,我会接受。
    猜你喜欢
    • 2013-05-20
    • 2014-11-25
    • 1970-01-01
    • 2016-07-12
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多