代码之家  ›  专栏  ›  技术社区  ›  Chris Sobolewski

从mysql中提取前x个单词(不仅仅是字符)

  •  13
  • Chris Sobolewski  · 技术社区  · 14 年前

    我希望能够从数据库字段中提取前x个单词,以便在预览中使用。基本上如果一个字段的内容是

     "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada."
    

    我想回音

     "Lorem ipsum dolor sit amet... see more"
    

    最好的方法是什么?

    我只知道要做的是在查询中提取整个字段,然后执行如下操作

    $foo = [query_results];
    $bar = explode(' ', $foo);
    for($x=0, $x<6, $x++){
         echo $bar[$x];
    };
    echo "... see more"
    

    有更好的办法吗?

    6 回复  |  直到 11 年前
        1
  •  16
  •   Mark Elliot    14 年前

    你肯定想用 SUBSTRING_INDEX 它将返回一定数量的字符,直到根据分隔符的出现达到指定的计数为止。在你的情况下,电话看起来是这样的:

     SELECT SUBSTRING_INDEX(text_field, ' ', 6) FROM ...
    

    特别是,这将返回多达6个 其中,我们将一个单词定义为一组字符,这些字符不是由空格分隔的空格。

    注释 :这将返回附加到最后一个单词的标点符号,可能需要,也可能不需要。在php中,替换字符串尾部的标点符号是非常简单的,但是如果您想完全保留在sql中,我认为您可以使用 TRIM . 其语法如下:

    SELECT TRIM(TRAILING ',' FROM SUBSTRING_INDEX(text_field, ' ', 6)) FROM ...
    

    删除后面的标点符号可能是一个更好的选择——但也许这是另一个问题(我仍然在寻找比trim更好的解决方案)。

        2
  •  5
  •   vicatcu    14 年前

    可以在查询中使用substring函数

    SELECT CONCATENATE(SUBSTRING(myfield, 0, N), "... see more") FROM mytable
    

    这会给你前N个字母…

    如果您真的想得到前n个单词,并且将单词定义为“由空格分隔”,那么您仍然可以在查询中执行以下操作

    SELECT CONCATENATE(SUBSTRING_INDEX(myfield," ", N), "... see more") FROM mytable
    
        3
  •  1
  •   Sean    14 年前

    我的理念是,不要让数据库工作得太辛苦。以我的经验,当你给mysql提供一个真正简单的查询,然后用php或任何你正在使用的语言进行“真正的”工作时,mysql会快得多。我不会遵循任何建议-抓住整个字符串,然后用你的脚本语言或选择缩小它。唯一的例外是字符串可能非常大-例如50KB或更大。在这种情况下,让数据库为您缩小可能更快。但实际上,除非您每秒执行数千个这样的查询(如果您做得不对,请使用某种缓存),否则我认为没有任何理由让数据库为您执行此操作。

        4
  •  0
  •   Sarfraz    14 年前

    方法1(更好):

    不,你也可以用 substring 函数直接从字段中获取所需文本。

    原型:

    SUBSTRING(string,position)
    

    例子:

    SELECT SUBSTRING(field, 25) FROM table
    

    方法2:

    也可以使用php substr 函数的作用相同,但首先必须从数据库中选择整个字段值。

    $cutted = substr($row['fieldname'], 0, 25) . '.....'; // get 25 chars and append ....
    

    就你而言:

    $str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris malesuada.";
    $parts = explode(" ", $str);
    print $parts[0] . ' ' .$parts[1] . ' ' .$parts[2] . ' ' .$parts[3] . ' ' .$parts[4] . '.....See More';
    

    输出:

    Lorem ipsum dolor sit amet.....See More
    
        5
  •  0
  •   pilsetnieks    11 年前
    <?php 
        echo "<h3>".$this->consult['page_caption']."</h3>
    
            ";
        $txt=array();
        $txt = explode(" ",html_entity_decode($this->consult['page_content']));
        $record = array();
        $k =count($txt);
    
        for($x=0;$x<=30;$x++){
            if(  $x < $k){
                //if($txt
                $record[] = $txt[$x];
            }
        }
    
        $outdata =implode(" ",$record);
        echo "<p>".$outdata." <a href='#'> more&raquo;</a></p>";
        // html_entity_decode($this->consult['page_content'])
    ?>
    

    我想这也会有帮助的。我在我的索引页上用它来获取部分内容,并链接到文章的主页。

        6
  •  0
  •   pilsetnieks    11 年前
    SELECT SUBSTRING(`Filed_Name`,1,X) FROM `Table` where field2 = 0
    

    tou可以用需要显示的字符替换substring子句中的x。