|
Yazan
|
Konu: MySQL CSV alanlarda arama yapmak (Okunma Sayısı 679 defa)
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
Merhaba,
MySQL veritabanımda CSV (virgülle ayrılmış) değerler tutuyorum, bu alan üzerinde arama özelliği oluşturmam gerekti. Bunu yapan özel bir fonksiyon ya da performansı düşürmeyecek algoritma önerileriniz var mı?
MySQL veri_form tablosu:
id poses 2 12,56,89 3 54,86,9 4 23,12,54,7 5 4,5,89,12
gibi bir tablo arama formundan örneğin 12 nolu poses'i hangi id'ler kullanıyor diyeceğim ve mantıklı bir sürede arama sonuçlarını göstereceğim. Tabloda yaklaşık 500 kayıt var.
Ne dersiniz?
|
|
|
|
« Son Düzenleme: 20, 2005, 03:54:09 am Gönderen: Allow-Man »
|
Logged
|
while(1) work;
|
|
|
serkan
Serkan Ceylani
Admin
Offline
Mesaj Sayısı: 134
|
Zor bir is bu 12 icin boyle bir sey var: 12,5, 120,3 1,12,125,8 1 veya 2 icin durum daha da karisik: 12,5, 120,3 1, 12, 125,8 Daha degisik bir veritabani tablo yapisi kurulamazmiydi : rid id poses 1 2 12 2 2 56 3 2 89 4 3 54 5 3 86 6 3 9
|
|
|
|
|
Logged
|
İletişim: xmpp:serkan@member.turk-php.com (Jabber) (Lütfen sorularınızı forum içinde sorunuz.) Arşiv: http://arsiv.turk-php.comSerkan
|
|
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
Abi şöyle bir durum; multiple select yapılabilen altı farklı combo-box'dan alınan değerler aralarına virgül konup veritabanına giriliyor ve bütün sistem bu şekilde çalışıyor yani veritabanında değişiklik yapmak ölümden beter  Senin yazdığın sıkıntı sanırım Select id From veri_form LIKE poses '%12%' ile arama yaparken var değil mi? Açıkçası ben bütün tabloyu çekip sonra explode edip karşılaştırmayı düşünmüştüm; senin ki baya bi daha iyi :-) Senin yoldan giderek şöyle bir şey yapsak: Select id From veri_form LIKE poses '%,12,%' Ne dersin çalışır mı?
|
|
|
|
|
Logged
|
while(1) work;
|
|
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
Ben cevap vereyim çalışmaz  id=12 değeri 12 ,32,58 şeklinde 32 ,12 ,58 şeklinde 12 şeklinde ya da; 32,56 ,12 şeklinde olabilir. Virgülün başta ya da sonda ya da her ikisinde de olması kolay ama tek başına ise 12 o zaman ıı ıh... Acaba LIKE kullanmadan id=12 diye aratıp, bir sonuç bulursa bu sonucun değerlerini arraye atıp; daha sonra LIKE'lı sorguları çalıştırıp tüm sonuçları merge mi etsem. Bu kesinlikle çalışır ama daha optimize bir şey söyleyebilecek olan yok mu?
|
|
|
|
|
Logged
|
while(1) work;
|
|
|
Erman Arık
Yeni Kullanıcılar
Offline
Mesaj Sayısı: 20
|
Daha optimize şeyi serkan hocamız söylemiş zaten
|
|
|
|
|
Logged
|
|
|
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
Doğrudur Serkan'ın önerisi tabii ki en iyisi ama, şu an elimde bulunan veritabanı mimarisini değiştirmeden bir çözüm üretmem gerekiyor, gerçekten yok mu bir önerisi olan?
|
|
|
|
|
Logged
|
while(1) work;
|
|
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
Bir saniye gibi bir performans kaybı ile haylice de amelece bir yolla, başka yol aklıma gelmedi, çözdüm. Şöyle ki; $key = $_POST['key'] // Sadece bir posses'i olan alanlardakileri buluyor... $sorgu[0] = "SELECT id FROM veri_form WHERE poses='$mtd'";
// Basinda ve sonunda virgul olan posesleri buluyor $sorgu[1] = "SELECT id FROM veri_form WHERE poses LIKE '%,key,%' ";
//Posses listesinin basinda yer alanlari buluyor $sorgu[2] = "SELECT id FROM veri_form WHERE poses LIKE '$key,%' ";
// Posses listesinin sonundakileri buluyor... $sorgu[3] = "SELECT id FROM veri_form WHERE poses LIKE '%,$key' ";
// Sonrada bunlari birlestirip sonuc kumesini elde ediyorum
$t=0; for($x=0; $x<4;$x++) { $gelen = @mysql_query($sorgu[$x]); while ($data = @mysql_fetch_array($gelen) { $sonuc[$t] = $data[$id]; $t++; } }
İlginize teşekkür ederim
|
|
|
|
|
Logged
|
while(1) work;
|
|
|
mudkicker
Arif Ender
Admin
Offline
Mesaj Sayısı: 873
Mastered PHP
|
full-text search ile olabilir belki... ama mysql manualden bunu araştırın yemeyedebilir... denemekten zarar çıkmaz 
|
|
|
|
|
Logged
|
|
|
|
Allow-Man
Alaattin Kahramanlar
PHP Öğrencisi
Offline
Mesaj Sayısı: 111
|
MySQL 4.0.1 sürümünden sonrası FULLTEXT index'leri destekliyor lakin sunucudaki MySQL eski... Yine de teşekkürler... full-text search ile olabilir belki... ama mysql manualden bunu araştırın yemeyedebilir... denemekten zarar çıkmaz 
|
|
|
|
|
Logged
|
while(1) work;
|
|
|
mudkicker
Arif Ender
Admin
Offline
Mesaj Sayısı: 873
Mastered PHP
|
hmm... o zaman kötü.
|
|
|
|
|
Logged
|
|
|
|
|
 |