MySQL分割长字符串成多个字段以及为表添加一列自动编号并替换字段

1.分割长字符串为多个字段

  处理数据时遇到的一个问题,本来表中的字段应该分开的,但是由于数据原因,导致所有字段混合到一个字段中,此时我们需要将长字符串切分成原本的不同字段才能进一步处理。

  如以下原始数据(用户对书籍的评分):应该分为 用户ID | 书本ID | 用户对书本的打分
BookRatings.png
  仅通过MySQL语句解决该问题的思路是通过' ";" '这个子字符串定位来分割内容:
CREATE TABLE BookRating1 AS
SELECT
    SUBSTR(bookrating ,1 ,LOCATE('";"',bookrating)-1) AS 'userID',
    SUBSTR(bookrating ,LOCATE('";"',bookrating)+ 3 ,LOCATE('";"',bookrating,LOCATE('";"',bookrating)+1) - LOCATE('";"',bookrating) -3) AS 'bookID',
    SUBSTRING(bookrating ,LOCATE('";"',bookrating,LOCATE('";"',bookrating)+1)+3) AS 'rating'
FROM BookRatings

  以上主要用到字符串处理函数 SUBSTR(),SUBSTRING(),LOCATE() 三个函数,用法可以自行搜索。

  分解后的表BookRating1即为:
BookRating1.png

2.添加一列自动编号以及字段替换

  从 bookID 这个字段看出其数字混杂着字母,所以打算将字符串按照行号重新设置 bookID为数值型以简化操作。
  先用 DISTINCT 方式取出所有的 bookID 建一个表名为 BOOKID的新表,

CREATE TABLE BOOKID AS
SELECT DISTINCT bookID 
FROM BookRating1

  然后按以下方式重新设置 bookID(即以行号作为书籍编号):

SET @x = 0;
CREATE TABLE BookIDNew AS
SELECT @x := IFNULL(@x,0)+1 AS bookID , bookID AS book 
FROM BOOKID

  添加自动编号后的表BookIDNew为:
BookIDNew.png

  最后用BookIDNew(原始BookRating1表中的书籍编号bookID在此表中的字段名变为book)新表中的 bookID 来替换原始表BookRating1中的 bookID 即可。

CREATE TABLE BookRatingFinal AS 
SELECT A.useID AS userID, B.bookID , A.rating
FROM BookRating1 A, BookIDNew B
WHERE A.bookID = B.book

  替换bookID后的新表BookRatingFinal如下所示:
BookRatingFinal.png

  至此,所有预处理已经完成了,可以愉快地进行数据分析啦~

你可能感兴趣的:(MySQL分割长字符串成多个字段以及为表添加一列自动编号并替换字段)