MySQL:制作摘录并将其复制到另一列

时间:2013-11-27 04:39:34

标签: php mysql sql sql-update

我需要从MySQL列中提取文本并将该文本复制到另一列。本文将摘录第一栏中的全文,我需要修剪15个主要字符,然后仅包含文本的下一个140 +/-字符,并将该文本复制到新列。

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

UPDATESET column1=column2

我看到函数LEFTRIGHT来修剪左侧或右侧的文字。

但是可以将LEFT和RIGHT组合去除前15个字符,然后复制下一个+或 - 140个字符吗?

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

当我说+或 - 140个字符时:是否有可能不打破可能在140结束时结束的单词?

2013年11月27日更新

以下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))));

3 个答案:

答案 0 :(得分:2)

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

已更新

我已经测试过了。即使没有空格,下面的查询也能正常工作。你可以在这里测试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                                                                                                                 |
+-----------------------------------------------------------------------------------------------------------------------+

答案 1 :(得分:1)

这是一个例子sqlFiddle example

只需将数字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 example中一样,只需用16代替你的15(你的15 + 1)并用140替换10的出现

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 proof 这是代码:

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))));

答案 2 :(得分:0)

您是否了解过mySQL中LEFT,RIGHT和SUBSTRING运算符的用法?您可以通过任何方式轻松抓取角色16.

UPDATE _table_ SET column1 = SUBSTRING(column2,16)

至于破词,你可能不得不使用PHP。