MySQL:摘录并复制到另一列


MySQL: make a excerpt and copy it to another column

我需要从MySQL列中提取文本,并将该文本复制到另一列。这篇文章将是第一列全文的摘录,因为我需要修剪15个前导字符,然后只包括接下来的140个+/-字符,并将该文本复制到一个新的列中。

当然,这可以将所有文本从一列复制到另一列:

UPDATESET column1=column2

我看到函数LEFT和RIGHT从左边或右边修剪文本。

但是否可以将LEFT和RIGHT组合起来去掉前15个字符,然后复制下一个+或-140个字符

没有我可以使用的分隔符;所有的文本都会有所不同。所以我需要能够数字符。

当我说+或-140个字符时:有可能不打断一个可能以140结尾的单词吗?

更新11/27/13

Jungsu Heo下面的这个查询可以工作,并且不会打断名为wp2_posts的表以及列post_excerptpost_content:的单词

UPDATE `wp2_posts`
SET post_excerpt = SUBSTRING(SUBSTRING(post_content, 55, 110),  1,
IF(LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1)) = 0,
LENGTH(SUBSTRING(post_content, 55, 110)), LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1))));

这很有趣。我已经测试了你想要的东西。

更新

我已经测试过了。即使并没有空格,下面的查询也能很好地工作。你可以在这里测试sqlfiddle。http://www.sqlfiddle.com/#!2/0bf19/2/1。(不幸的是,我们无法在sqlfiddle中运行DML)

UPDATE tab SET cite = SUBSTRING(SUBSTRING(col, 16, 130),  1, IF(LENGTH(SUBSTRING(col, 16, 130)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(col, 16, 130), ' ', -1)) = 0, LENGTH(SUBSTRING(col, 16, 130)), LENGTH(SUBSTRING(col, 16, 130)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(col, 16, 130), ' ', -1))));

这是一个循序渐进的例子:

set @str = 'ABC 1234 56789';
set @ltrim_len = 5;
set @ltrimmed_str = SUBSTRING(@str, @ltrim_len);
set @right_word_warp = SUBSTRING_INDEX(@ltrimmed_str, ' ', -1);
set @final_sub_len = LENGTH(@ltrimmed_str) - LENGTH(@right_word_warp);
SELECT SUBSTRING(@ltrimmed_str,  1, IF(@final_sub_len = 0, LENGTH(@ltrimmed_str), @final_sub_len)) AS cite;
+-------+
| cite  |
+-------+
| 1234  |
+-------+

我原来的答案(没有空格时无效)

给定"ABC 12345 6789",然后修剪"ABC"并修剪"6789"以获得确切的单词扭曲。最后我们得到了"12345"。

以下是我测试的内容。一步一步的例子。最后的答案是最后一个sql。

set @str = 'ABC 12345 6789';
SELECT @str;
+----------------+
| @str           |
+----------------+
| ABC 12345 6789 |
+----------------+
SELECT SUBSTRING(@str, 5);
+--------------------+
| SUBSTRING(@str, 5) |
+--------------------+
| 12345 6789         |
+--------------------+
SELECT SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1);
+--------------------+
| SUBSTRING(@str, 5) |
+--------------------+
| 12345 6789         |
+--------------------+
SELECT LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1));
+------------------------------------------------------+
| LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1)) |
+------------------------------------------------------+
|                                                    4 |
+------------------------------------------------------+
SELECT SUBSTRING(SUBSTRING(@str, 5),  1, LENGTH(SUBSTRING(@str, 5)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1)) );
+-----------------------------------------------------------------------------------------------------------------------+
| SUBSTRING(SUBSTRING(@str, 5),  1, LENGTH(SUBSTRING(@str, 5)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1)) ) |
+-----------------------------------------------------------------------------------------------------------------------+
| 12345                                                                                                                 |
+-----------------------------------------------------------------------------------------------------------------------+

这里有一个示例sqlFiddle示例

只需将数字2替换为15个前导字符,将数字10替换为140,就可以了。它删除前2个字符,然后找到10个字符,并通过在末尾定位空格来删除最后一个块。

 UPDATE `table` SET column1=
                     LEFT(                   LEFT(RIGHT(column2,LENGTH(column2)-2),10),
                          10-
                          LOCATE(' ',REVERSE(LEFT(RIGHT(column2,LENGTH(column2)-2),10)),1)
                         );

或者,您也可以使用SUBSTRING而不是RIGHT,就像在这个sqlFiddle示例中一样,只需将3的出现次数替换为16(您的15+1),并将10的发生次数替换为140

UPDATE `table` SET column1=
 LEFT(                   LEFT(SUBSTRING(column2,3),10),
      10-
      LOCATE(' ',REVERSE(LEFT(SUBSTRING(column2,3),10)),1)
     );

编辑:实际上,因为你想让一个单词以140结尾,你可能不得不用141代替10的出现次数,因为它会掉掉它找到的最后一块单词,所以如果你的单词以140结束,你不想让它掉,所以试试141。
-------------------------------------------
更新上面的答案是错误的——它对其他情况不起作用 下面的新答案
这个答案在15(你的140)边界附近有更多的案例需要测试
这是sqlFiddle的证明这是代码:

UPDATE `table` SET column1=
 IF(LENGTH(LEFT(SUBSTRING(column2,3),16)) < 16,
    LEFT(SUBSTRING(column2,3),16),
    LEFT(LEFT(SUBSTRING(column2,3),16),
         LENGTH(LEFT(SUBSTRING(column2,3),16))-
         LOCATE(' ',REVERSE(LEFT(SUBSTRING(column2,3),16)),1)
        )
   );

只需将所有出现次数3更改为16(您的15+1),将出现次数16更改为141(您的140+1)
-------------------------------------------------------------
最新更新问题的答案

UPDATE wp2_posts,
       wp2_term_relationships,
       wp2_term_taxonomy
SET post_excerpt = SUBSTRING(SUBSTRING(post_content, 55, 110),  1,
IF(LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1)) = 0,
LENGTH(SUBSTRING(post_content, 55, 110)), LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1))));
WHERE (wp2_posts.ID = wp2_term_relationships.object_id)
AND (wp2_term_relationships.term_taxonomy_id = wp2_term_taxonomy.term_taxonomy_id
     AND wp2_term_taxonomy.taxonomy = 'category'
     AND wp2_term_taxonomy.term_id = '213');

或者,如果您喜欢保留所有INNER JOIN语法
,如以下

UPDATE wp2_posts
  INNER JOIN wp2_term_relationships
  ON (wp2_posts.ID = wp2_term_relationships.object_id)
  INNER JOIN wp2_term_taxonomy
  ON (wp2_term_relationships.term_taxonomy_id = wp2_term_taxonomy.term_taxonomy_id
  AND wp2_term_taxonomy.taxonomy = 'category'
  AND wp2_term_taxonomy.term_id = '213')
SET post_excerpt = SUBSTRING(SUBSTRING(post_content, 55, 110),  1,
  IF(LENGTH(SUBSTRING(post_content, 55, 110)) -
  LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1)) = 0,
  LENGTH(SUBSTRING(post_content, 55, 110)), LENGTH(SUBSTRING(post_content, 55, 110)) -
  LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1))));

您了解过在mySQL中使用LEFT、RIGHT和SUBSTRING运算符吗?你可以通过任何方式轻松抓取字符16。

UPDATE _table_ SET column1 = SUBSTRING(column2,16)

至于打断单词,你可能需要使用PHP。