MySQL ile bölünmüş Sütun

3 Cevap php

Geçenlerde oldukça kirli bir veritabanına sahip bir projeyi devraldı ... masa "kullanıcılar" a "telefon" sütunu vardır ... Sorun sütun "/" ile ayrılmış birden fazla telefon numaralarını tutan olmasıdır. Bunların hepsini ayrı ayrı sütunlarda (telefon 1, PHONE2, phone3 vb) koymak istiyorum Ama bunu yapmak için en iyi yolu nedir hiçbir fikrim yok olurdu. Yalnız MySQL ile mümkün mü? Ben PHP script çeşit yazmak mı? Herhangi bir ipucu büyük takdir ...

Mikrofon

3 Cevap

Eğer kayıt başına gereken telefon numarası sayısının emin değilseniz, size bir telefon numaraları tablo var isteyebilirsiniz. Bunu (ben belirli bir biçimi için telefon numaralarını sterilize ve InnoDB kullanmak yok varsayarak) gibi veritabanını güncellemek için bir php komut dosyası çalıştırmak için daha kolay olabilir:

Telefon numarası tablo oluşturun:

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

Sonra Varolan alan verileri bölmek ve yeni bir tabloya ekler oluşturmak için bir php script yazmak.

EDIT: benim yorumum aşağıda belirtildiği gibi her şeyi güncelleyebilirsiniz kadar, hala birlikte telefon numaralarını concat olurdu bir geriye Compatable görünüm olabilir:

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`

bir PHP komut dosyası yazma muhtemelen en iyi bahistir.

Olası telefon numaralarının sonlu bir dizi var mı? Eğer öyleyse, ben sadece onlar için yeni sütunlar yapacak. Eğer değilse, ben bir kullanıcı kimliği içeren yeni bir telefon numarası tablosunu yapmak ve bu şekilde onları ilişkilendirmek istiyorum.

after that, just query for the data, and use $phone_array = explode("/",$phone_data);

sonra tekrar veritabanına koymadan başlar.

ayrıca, substring_index fonksiyonunu kullanarak, sorguları bir dizi ile yapabilirsiniz.

Ben kesinlikle bir senaryo olarak bu yazımı bitirmek istiyorum.

Ben tamamen yeni bir tabloya tüm telefon numaralarını koyarak fikir gibi, ama bunu yaparken performans veya uygulama sorunları ile ilgili sorunlar varsa olacak o zaman, emin, Telefon1, Telefon2 vb gibi alanları terk

Ya çözüm DB erişmek nasıl bağlı .. böyle bir şey bakmak ve olası tüm performansını eek gerekiyorsa. Olur

Herhalde böyle bir şey ile bitirmek istiyorum:

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

Ben telefon numaraları olarak kaydedilmesini garip parçaları önlemek için yerinde dize uzunluğu test var. Ayrıca kaydetmeden önce oldukça kadar her telefon numarasını biraz regex sihir kullanabilirsiniz.

Daha hızlı yapmak için yollar aynı sorguda birden çok güncelleştirmeyi çalıştırmak olacaktır. Senin üzerinde komut kez o her yürütme tarafından etkilenen ve bunu birden çok kez çalıştırılan kullanıcı satır sayısını kısıtlamak olsaydı.