Virgülle ayrılmış değerden aranıyor

4 Cevap php

Bu, o 'benim tanrım' anlarından biridir.

Firmamızda önceki programcı PHP ve MySQL kullanarak kötü kodlu uygulamanın arkasında bıraktı.

Bir örnek bir virgül MySQL ayrılmış değer olarak o her müşteri için seçenekleri saklı olmasıdır. Tüm uygulama bazlı NOT OOP ve böylece PHP'nin 500 + sayfaların hemen hemen her sayfada tekrarlanan referanslar ve sorguları vardır. Yani şema ve veri depolama mantık değiştirmek için artık kolay bir iş değil.

Altı ay bir konuda sistemini ayarlamak için, ben bu virgülle ayrılır ve değerler üzerinde bir arama gerçekleştirmek için bir yol arıyorum. Birisi fazla performans etkisi olmadan böyle CSV arama hakkında herhangi bir fikir var mı? Ben iyi olacak değil biliyorum, ama en azından ben yeni bir uygulama hazır önce başka bir altı ay gitmek için uygulamayı itebilir.

Herhangi bir yardım için teşekkür ederiz

4 Cevap

Ne doğru CSV birden fazla sütuna sütun (veya birden çok kaydı) bir kez toplu işlem olarak, ve sonra bu kullanıcı için girişi (veya girişleri) yenilemek için eski masanın üzerinde birlikte bir güncelleştirme tetikleyici cobbling tatili bir tablo oluşturma hakkında? Sonra yeniden kod setter mantık gerek kalmadan genelinde iyi sorgularını yazabilirsiniz.

Burada şema veya temsil değiştirmeden bunu işleme için bir fikir:

<?php
function checkoption ($user, $option)
{
    global $db;
    $rs = mysql_query ("select option_field_name from customer where user = '$user'", $db);
    if ($rs)
    {
         // enclose result in commas to remove edge cases for next test
         $opts = ",," . $rs ['option_field_name'] . ",";
         return strpos ($opts, ",$option,") != false;
    }
    return false;
}
?>

Bu çevreleyen virgül fazladan bir çift ile tüm başvuruları ele alarak kullanıcı için alana ,option, arar ve kenar durumlarda karşı korur. Null sorun karşı sıfır önlemek için, ek bir virgül db dize ön eklenir.

Yani bir kullanıcının belirli bir seçeneği vardır tüm satırları döndüren bir sorgu istiyor söylüyorsunuz?

Peki, ugh ... tamam, bu hoş değil, ama siz zaten, biliyoruz:

select * from user_table
   where concat(',',option_field,',') like "%,option_you_want,%"

Ben performans etkisi konuşamıyor - büyük olasılıkla hoş değil, ama ben diğer seçenek ayrı bir tabloya satır patlak olduğunu düşünüyorum, ama o sizin için gerçekçi mevcut değil diyorsun.