使用MySQL拆分列

时间:2009-11-02 22:13:29

标签: php sql mysql

我最近接手了一个项目非常脏的数据库......表“users”有一个“电话”列......问题是该列包含多个用“/”分隔的电话号码。我想将所有这些放在单独的列中(电话1,电话2,电话3等)但不知道最好的方法是什么。单独使用MySQL是否可行?我应该写一些PHP脚本吗?任何提示都将不胜感激......

麦克

3 个答案:

答案 0 :(得分:5)

编写PHP脚本可能是你最好的选择。

是否有可用的电话号码数量有限?如果是这样,我会为他们制作新的专栏。如果没有,我会创建一个包含用户ID的新电话号码表,并以这种方式将它们联系起来。

之后,只需查询数据,然后使用     $ phone_array = explode(“/”,$ phone_data);

然后开始将它们插回数据库。

另外,您可以使用substring_index函数进行一系列查询。

答案 1 :(得分:4)

如果您不确定每条记录所需的电话号码的数量,您可能需要一个电话号码表。您可能更容易运行php脚本来更新数据库(我假设您没有将您的电话号码清理为特定格式并且您使用INNODB):

创建电话号码表:

CREATE TABLE `user_phone` (
  `userid` int(10) unsigned NOT NULL,
  `phone` char(15) NOT NULL,
  PRIMARY KEY  (`userid`,`phone`),
  CONSTRAINT `fk_user_phone_userid` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

然后编写一个php脚本来拆分现有的字段数据并在新表中创建插入。

编辑:正如我在评论中所提到的,你可以有一个向后兼容的视图,它仍然可以将电话号码连在一起,直到你可以更新所有内容:

CREATE VIEW `old_table` AS
    select `u`.*, group_concat(`up`.`phone` separator '/') AS `phone`
    from `user_phone` `up`
        left join `users` `u` on(`up`.`userid` = `u`.`userid`)
    group by `u`.`userid`

答案 2 :(得分:0)

我肯定最终会把它写成一个剧本。

我喜欢将所有电话号码完全放入新表格的想法,但如果在执行此操作时遇到性能或实施问题,请确保将字段保留为phone1,phone2等。

这两种解决方案看起来都是这样的......取决于你如何访问数据库,以及你是否需要找出所有可能的性能。

我可能最终得到类似的东西:

$query = "SELECT id, phone FROM users";
$result = $db->query($query);
while ($row = $result->fetch_assoc()) {
  $phones = array();
  $phones = explode('/', $row['phone']);
  $i = 1;
  foreach($phones as $p) {
    if (strlen($p) >= 7) {
      $row['phone'.$i] = $p;
      $i++;
    }
  }
  $upquery = "UPDATE users SET phone1='{$row['phone1}', phone2='{$row['phone2}', ...
              WHERE id={$row['id'];";
  $result = $db->query($query);
}

我进行了字符串长度测试,以防止将奇数片段保存为电话号码。在保存之前,您还可以使用一点正则表达式魔法来提升每个电话号码。

使速度更快的方法是在同一查询中运行多个更新。如果脚本超时,则可以限制每次执行所影响的用户行数,并多次运行。