MYSQL在字段中排序单词

时间:2014-12-18 00:24:27

标签: mysql sql

编辑1 代码只是一个例子,我没有郊区数据,我的真实数据是继承和杂乱的,可以通过从数据库创建代码或创建参考数据来修复。这个问题应该像是否有人有一个好的细胞分类功能或其他可以重复使用的解决方案?

CREATE TABLE postcode (
`id` int NOT NULL AUTO_INCREMENT,
`suburbs` varchar(2000) DEFAULT NULL,
  PRIMARY KEY (`id`)
)  ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;

插入

INSERT INTO  postcode (`suburbs`)
VALUES ( 'Zackville;Astor;Mary-town;Jackson' );

要将字段排序为

的结果
  

艾斯特;杰克逊;玛丽镇; Zackville

1 个答案:

答案 0 :(得分:0)

所有评论都有非常有效点,而您应该尝试避免使用RDBMS中的分隔值。

话虽如此,如果您仍然坚持使用现有数据库并且出于某种原因想要在数据库级而不是客户端代码上执行此操作,则可以利用计数(数字)表和SUBSTRING_INDEX()将分隔的值拆分为行,然后GROUP_CONCAT()以有序的方式将数据转回。

创建计数表的几种方法之一:

CREATE TABLE tally (n int not null primary key);
INSERT INTO tally (n)
SELECT a.N + b.N * 10 + 1 n
 FROM 
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n

计数表中的行数应大于或等于最大可能的分隔值数。

现在采用分隔值:

UPDATE postcode p JOIN
(
  SELECT id, GROUP_CONCAT(suburbs ORDER BY suburbs SEPARATOR ';') suburbs
    FROM
  (
    SELECT t.id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.suburbs, ';', n.n), ';', -1) suburbs
      FROM postcode t CROSS JOIN tally n
     WHERE n.n <= 1 + (LENGTH(t.suburbs) - LENGTH(REPLACE(t.suburbs, ';', '')))
  ) q
   GROUP BY id
) s 
    ON p.id = s.id
   SET p.suburbs = s.suburbs;

输出:

| ID |                           SUBURBS |
|----|-----------------------------------|
|  1 | Astor;Jackson;Mary-town;Zackville |

这是 SQLFiddle 演示