Türkiye'nin En Eski Webmaster Forumu İyinet'e Hoşgeldiniz!

mysql sorgusu ile ilgili

Ozcan

0
Onaylı Üye
Üye
Katılım
12 Mayıs 2007
Mesajlar
3,749
Açılan Konu
428
Tepki puanı
61
Konum
Antalya
sorgularken

on iki or on or iki gibi bir kod kullanıyorum diyelim.

Arama sonuçlarında ilk önce on iki ile aradıklarım gelsin daha sonra on ile aradıklarım en sonda iki ile aranılanlar bu şekilde nasıl sıralama yapabilirim. hepsi aynı sütünda aranacak.
 

Angelo

0
Onaylı Üye
Üye
Katılım
13 Aralık 2004
Mesajlar
9,603
Açılan Konu
164
Tepki puanı
106
Konum
AZ
LIKE ile mi yapıyorsun, tablo büyükse performansı fena yapar. Full Text Matching daha mantıklı. Like ile or'layarak sıralıyorsan illa yapılabilecek bir kaç şey var. INSTR ya da POSITION ile tek tek kelime1, kelime2 ve kelime1+kelime2 ye göre pozisyon alırsın, kelime1+kelime2 ye göre pozisyon 0'dan büyükse (yani match var demektir) bir score column'u açarsın. Sonra o column'a göre DESC sıralarsın.

SELECT INSTR('on iki',field) AS pozisyon;

mysql syntax'ini tam bilmiyorum postgre de şöyle birşey yazılabilir

SELECT CASE WHEN STRPOS('on iki',field) != '0' THEN '1' END as match1;

Ikinci bir yaklaşım eğer uzun satırlar değilse bunlar, ne bliyim isim içinde arıyorsan mesela, soundex() veya Levenshtein uzaklığı da kullanılabilir.

Tabi en iyisi full matching, bunlar çok performans gerektiren lüzumsuz işlemler.
 

Angelo

0
Onaylı Üye
Üye
Katılım
13 Aralık 2004
Mesajlar
9,603
Açılan Konu
164
Tepki puanı
106
Konum
AZ
Ayrıca bunu php ile de döndürerek skorlayabilirsin. Ben genelde çok komplike skorlama gerektiren şeylerde, tek query ile tüm datayı array'e alıp, php de döndürerek skorlayarak formata sokuyorum. Çok daha hızlı olur. SQL'de strpos, replace, levenshtein gibi olaylar php ye nazaran çok daha yavaş işliyor doğal olarak.
 

Ozcan

0
Onaylı Üye
Üye
Katılım
12 Mayıs 2007
Mesajlar
3,749
Açılan Konu
428
Tepki puanı
61
Konum
Antalya
Angelo aramayı like ile on or iki şeklinde yaptırıyorum. İki sütunda birisi başlık birisi mesaj alanları. 50 bin kayıt var. Arama sonuçlarını or la ayırdığım için alakasız mesajlar ilk sıralara geliyor bunun için ilk önce konu ile alakası daha yakın olan örnekteki gibi on iki lerin ilk sıraya gelmesini sağlamaya çalışıyorum.
 

Angelo

0
Onaylı Üye
Üye
Katılım
13 Aralık 2004
Mesajlar
9,603
Açılan Konu
164
Tepki puanı
106
Konum
AZ
Dediğim gibi performansı kötü etkiler. PHP'de çok basitçe yapabileceğini düşünüyorum. while ile döndürürken dediğim gibi pozisyon alma işlemi yaparsın. X ve Y match ise, skor 1 verirsin, değilse 0. Sonra array'e alırsın, array'i skora göre sıralarsın. Çözemezsen örnek atayım.
 

Ozcan

0
Onaylı Üye
Üye
Katılım
12 Mayıs 2007
Mesajlar
3,749
Açılan Konu
428
Tepki puanı
61
Konum
Antalya
Zahmet olmazsa süper olur :) .
 

Angelo

0
Onaylı Üye
Üye
Katılım
13 Aralık 2004
Mesajlar
9,603
Açılan Konu
164
Tepki puanı
106
Konum
AZ
PHP:
$q = mysql_query("SELECT id, alan FROM tablo WHERE alan LIKE '%on%' OR alan LIKE '%iki%'");
/* id unique alan olmali */

  while ($a = mysql_fetch_array($q)) {
  $index = $a['id'];

    if (eregi('on iki',$a['alan'])) $score[$index] = 1;
    else $score[$index] = 0;
  
  $data[$index] = $a['alan'];
  }
             
arsort($score);

  foreach ($score as $k=>$v) {
  echo $data[$k].'<br>';
  }
 

iyinet

Root
Root
İyinet Ekibi
Onaylı Üye
Katılım
2 Eylül 2002
Mesajlar
5,034
Açılan Konu
485
Tepki puanı
75
Konum
SEO
sorgularken

on iki or on or iki gibi bir kod kullanıyorum diyelim.

Arama sonuçlarında ilk önce on iki ile aradıklarım gelsin daha sonra on ile aradıklarım en sonda iki ile aranılanlar bu şekilde nasıl sıralama yapabilirim. hepsi aynı sütünda aranacak.

select .. from ... ORDER by field(<alan_adi>,'on iki','on','iki')
 

Ozcan

0
Onaylı Üye
Üye
Katılım
12 Mayıs 2007
Mesajlar
3,749
Açılan Konu
428
Tepki puanı
61
Konum
Antalya
select .. from ... ORDER by field(<alan_adi>,'on iki','on','iki')

bu işe yaramıyormuş :) mesela şuna göre sıralıyor hiç bir anlamı olmuyor


adı iki
adı on
baba on
zurna on iki

burada zurna en sonda çıkıyor gene ilk sırada çıkması lazım.
 
Üst