İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

mysql sorgusu ile ilgili

Ozcan

0
İyinet Üyesi
Katılım
12 Mayıs 2007
Mesajlar
3,749
Reaction score
60
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
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
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
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
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
İyinet Üyesi
Katılım
12 Mayıs 2007
Mesajlar
3,749
Reaction score
60
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
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
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.
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
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
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
69
Konum
Sakarya
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
İyinet Üyesi
Katılım
12 Mayıs 2007
Mesajlar
3,749
Reaction score
60
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.
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Üst