İlk önce bu ihtiyaç sphinx ile doğdu onu söylim, Sphinxten aldığım ID’ler RANK ve ORDER moda göre zaten dizilmiş, fakat bunu mysql’e gönderdikten sonra bir ORDER işlemi yapmıyorsak, tablomuzun varsayılan dizilişine göre geliyor, yani elimizde ilk 10 oluyor, fakat bu ilk 10 arasındaki sıralamayı sphinx yapmış da biz bunu mysql’e gönderdikten sonra order değişiyor, sphinx gibi dizmek istediğimizde ne yapabiliriz diye araştırıyordum, ilk akla gelen her ID için tekrar veritabanına gitmek, tekrar gitmemek için bir çözüm de uniuon, ama ikisi de performansın taban yaptığı işlemler, mysqlde bunun çok güzel bir çözümü var,

0
FIELD()

php’deki array_search getirebilir akıllara ama fonksiyonun tam olarka nasıl çalıştığını anlamak için şunu deneyebilirsiniz

0
SELECT FIELD(1,0,2,3,1,5,6)

ilk değerin sonraki kaçıncı parametre olduğunu dönüyor, yani yukarıdakinin sonucu 4, 0 id gelirse bu 1, buna göre dizdiğimiz de gerçekten satır istediğimiz sırada geliyor, aklımızda Search to Item, countlarını tutarak bir populerite sistemi vardı, bu populeriteye bunu da eklediğimizde kesinlikle daha kaliteli sonuçlar alacağız.

Örnek bir php kodu

0
1
2
3
4
5
6
7
8
9
10
11
12
 $sp = new SphinxClient();
 $sp->SetServer('localhost',3312);
 $sp->SetMatchMode(SPH_MATCH_ANY);
 $sp->SetRankingMode(SPH_RANK_WORDCOUNT);
 $sp->SetLimits(0,10);
 
 $result = $sp->Query('hello world');
 
if($result['total_found'] > 0)
{
   $found_ids = implode(',',array_keys($result['matches']));
   $q_result = $db->query("SELECT * FROM items WHERE id in({$found_ids}) ORDER BY FIELD(id,{$found_ids})");
}

gerçek bir order oldu tşkler mysql (:
Bu fonksiyonu array_search’e benzetmemden dolayı bir deneme daha yaptım (:

0
SELECT FIELD('test','t','te','tes','test')

sonucun burda da 4 gelmesi fonksiyonu anladığımızı gösteriyor.

Mysql’de biçok şey için takla atmak zorunda kalıyoruz. Biçok veritabanı Ranking için çok özel şeyler yapsa da Mysql bu konuya hiç girmemiş maalesef.
Veritabanımızdan aldığımız bir liste örn:Kullanıcılar olsun. kullanıcıları biz ID sırasına dizerken. Puan sıralamasına göre kaçıncı sırada olduğunu yazmamız gerekebilir.

Sıralama yapmak için, veritabanına elemanları o kritere göre dizdirmek zorunda olmamalıyız (ORDER BY PUAN DESC gibi bir ifade yazmak zorunda olmamalıyız, ID sırasına göre dizip PUAN sırasını öğrenebilmeliyiz).  Sizin için 100 Puan ile  3üncü sıradasınız gibi bir açıklamayı veritabanım sayesinde verebilmeliyim.

İlk önce örneklerde kullanacağımız tablo ve verileri oluşturalım.

0
1
2
3
4
5
6
7
8
9
10
CREATE TABLE RANK_USERS
(
 ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
 USERNAME VARCHAR(30) NOT NULL,
 FLEX_POINT INT NOT NULL DEFAULT 0,
 STRENGTH_POINT INT NOT NULL DEFAULT 0
);
-- bu sorguyu çalıştırdıktan sonra 1 satır ekleyip aşağıdaki sorguyu birkaç defa çalıştırıp populasyon sağlayalım
INSERT INTO RANK_USERS
(USERNAME,FLEX_POINT,STRENGTH_POINT)
SELECT 'USER_X',rand()*900,rand()*900 FROM RANK_USERS;
0
1
SET @siralama:=0;
SELECT @siralama:=@siralama+1 AS SIRALAMA,ID FROM RANK_USERS ORDER BY FLEX_POINT

FLEX_POINT alanına göre dizip sıralamayı alabilmek için geçici bir değişken set ediyoruz. ve her satırda artması için +1 yapıyoruz.
fakat bu tek başına işimize yaramıyor. Çünkü biz bu dizilime göre kimin kaçıncı sırada olduğunu zaten anlayabilir ya da programlarımızda bu iterasyonu kendimiz yapabiliriz.

“FLEX_POINT sıralamasına göre 1inci olan oyuncu STRENGTH_PINT sıralamasına göre kaçıncı acaba ?”
yine yukardaki basic sorguya ufak bir şart eklenip tek kullanıcı için bulunabilir, peki bunları sütunlar halinde yanyana görmek istersek ?.
Yöntemi açıklıyorum hemen : sağ elinizde sol kulağınızı başınız arkasından tutmanız gerekiyor (: hadi yapalım o zaman.

0
1
2
3
4
5
6
7
8
9
10
11
12
SET @flexRank:=0;
SET @strRank:=0;
 
SELECT
R.ID,R.USERNAME,flexRankTable.RANK FLEX_RANK,strRankTable.RANK STR_RANK
FROM
RANK_USERS R
JOIN
(SELECT @flexRank:=@flexRank + 1 RANK,RU.* FROM RANK_USERS RU ORDER BY RU.FLEX_POINT DESC) flexRankTable
ON R.ID = flexRankTable.ID
JOIN
(SELECT @strRank:=@strRank + 1 RANK,RU.*  FROM RANK_USERS RU ORDER BY RU.STRENGTH_POINT DESC) strRankTable
ON R.ID = strRankTable.ID

Sonuç :

Evet amacımıza ulaştık ama bunu diğer veritabanları nasıl yapıyor görelim hemen

Mssql

0
1
2
3
SELECT ID,USERNAME
row_number() over(ORDER BY FLEX_POINT DESC)  FLEX_RANK,
row_number() over(ORDER BY STRENGTH_POINT DESC) STR_RANK
RANK_USERS

ayrıca bu örnekler bize veritabanından aldığımız tablodaki satır numarasını veriyor. mysqlde gerçek ranking işlemini hala yapabilmiş değilim yazabilirsem mutlaka paylaşacağım. msqsl için row_numver() yerine rank() kullandığımızda bize gerçek bir ranking yapıyor. ve puanı eşit olanların sıralaması da aynı geliyor.

Oracle’da ise bunu biraz daha abartıp rankingi partitionlara göre ayırabilioruz. örn her yılın 1 incisini ayrı ayrı görebilmek gibi. yıl sütunu eklemeyip ID için mod 10 alıp yapacağım.
her 10 kullanıcıyı kendi arasında 1 den 10 a kadar dizmek istersek puana göre:

0
1
SELECT rank() over (partition BY mod(id,10) ORDER BY FLEX_PINT DESC)
FROM RANK_USERS

olay budur (: mysql’de diğer veritabanlarına benzer rank işlemini de yapabilmek için sanırım bir tur daha dönmek, bir takla daha atmak gibi bi şartımız olacak onu öğrenince blogumdan bulabilirsiniz (:
iyi çalışmalar..

yeni nesil webcilerin en cok ihtiyac duyduğu şeylerden biri  sanırım (:   seo için mysqlde bir fonksiyon ve auto seo yapan bir trigger.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
DROP FUNCTION IF EXISTS seo_yap $$
CREATE FUNCTION seo_yap(mix VARCHAR(255)) RETURNS varchar(255)
BEGIN
DECLARE seo_title VARCHAR(255);
SET seo_title=REPLACE(mix,'i','i');
SET seo_title=REPLACE(seo_title,'ş','s');
SET seo_title=REPLACE(seo_title,'ö','o');
SET seo_title=REPLACE(seo_title,'ğ','g');
SET seo_title=REPLACE(seo_title,''',' ');
SET seo_title=REPLACE(seo_title,'ü','u');
SET seo_title=REPLACE(seo_title,'ç','c');
SET seo_title=REPLACE(seo_title,'ü','u');
SET seo_title=REPLACE(seo_title,'ö','o');
SET seo_title=REPLACE(seo_title,'Ö','o');
SET seo_title=REPLACE(seo_title,'ş','s');
SET seo_title=REPLACE(seo_title,'Ş','s');
SET seo_title=REPLACE(seo_title,'Ç','c');
SET seo_title=REPLACE(seo_title,'ç','c');
SET seo_title=REPLACE(seo_title,'Ğ','g');
SET seo_title=REPLACE(seo_title,'ğ','g');
SET seo_title=REPLACE(seo_title,'Ü','g');
SET seo_title=REPLACE(seo_title,'İ','i');
SET seo_title=REPLACE(seo_title,'ı','i');
SET seo_title=REPLACE(seo_title,'I','i');
SET seo_title=REPLACE(seo_title,'ß','b');
SET seo_title=REPLACE(seo_title,'''',' ');
SET seo_title=lower(seo_title);
SET seo_title=REPLACE(seo_title,'{',' ');
SET seo_title=REPLACE(seo_title,'(',' ');
SET seo_title=REPLACE(seo_title,')',' ');
SET seo_title=REPLACE(seo_title,'[',' ');
SET seo_title=REPLACE(seo_title,'}',' ');
SET seo_title=REPLACE(seo_title,']',' ');
SET seo_title=REPLACE(seo_title,'=',' ');
SET seo_title=REPLACE(seo_title,'?',' ');
SET seo_title=REPLACE(seo_title,'&',' ');
SET seo_title=REPLACE(seo_title,'%',' ');
SET seo_title=REPLACE(seo_title,'*',' ');
SET seo_title=REPLACE(seo_title,'.',' ');
SET seo_title=REPLACE(seo_title,'|',' ');
SET seo_title=REPLACE(seo_title,'\\',' ');
SET seo_title=REPLACE(seo_title,'!',' ');
SET seo_title=REPLACE(seo_title,'^',' ');
SET seo_title=REPLACE(seo_title,'_',' ');
SET seo_title=trim(seo_title);
SET seo_title=REPLACE(seo_title,' ','-');
SET seo_title=REPLACE(seo_title,'----','-');
SET seo_title=REPLACE(seo_title,'---','-');
SET seo_title=REPLACE(seo_title,'--','-');
RETURN seo_title;
END $$

Veritabanından çekerken yapmamız gerken alanı fonksiyon parantezleri içine almak
örneğin

0
 $db->sql("SELECT seo_yap(haber_basligi) as seo_baslik,haber_basligi as normal_baslik FROM haberler");

bir de bunu insert ve update anında kullanabilirsiniz seo başlık için bir alanınız varsa
otomatikleştirmek için de aşağıdaki örnek triggerlarla kendi triggerlarınızı yazabilirsiniz.

Örneğin WordPress php dosyalarında Seo yapmasaydı mysqlde seo_yap ve aşağıdaki triggerları kurulum anında yazmak yetecekti

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DROP TRIGGER IF EXISTS seo_yap_insert $$
CREATE TRIGGER seo_yap_insert
     BEFORE INSERT ON wp_posts
     FOR EACH ROW
     BEGIN
             SET NEW.post_name=seo_yap(NEW.post_title);
END $$
 
DROP TRIGGER IF EXISTS seo_yap_update $$
CREATE TRIGGER seo_yap_update
     BEFORE UPDATE ON mixes
     FOR EACH ROW
     BEGIN
          IF seo_yap(NEW.post_title) <> OLD.post_name THEN
             SET NEW.post_name=seo_yap(NEW.post_title);
          END IF;
END $$

bunları sorgularken demiliterları $$ olarak değişirmeyi unutmayın (:

php – sql ile en sık yapılan işlemlerden biri de sql den veriyi alıp tabloya dökmektir. bunu artık bir ızdırap gbi görüp kendi kodlarını copy paste yapıp sonra da aynı kodlar arasında kaybolanımız bile var ben de bir zamalar öyleydim taaa ki sınıfımı yazana kadar (:

sınıfın özellikleri .

sql bağlantısı : (mysql, firebird, oracle);
query kullanım alanına göre nesne ya da source olarak dönebilme özelliği.
(array,assoc,object,row) yine tercihinize göre fetch metodları
hata gösterimi.
debug Özelliği. (Her sorugdan sonra sorgulanan cümle ve obje oluşturulduğundan bu yana geçen mikrosaniye)
kolay insert : $EklenecekDizi['alan_adi']=>’Değeri’; gibi dizi verip db ye atabilme.
kolay update : insert ozelliğinde yine dizi vererek update cümlesi hazırlayıp sorgulayablen bir özellik
obje oluşturulduğundan ekrana yazdırılana kadar çalıştırılan sql sayısını alabilme.
db bağlantı clonlayabilme : objeler arası veri alışverişinde kolaylık ve 1den fazla data ile çalışabilme.
insertten sonra id alma : mysql_insert_id fonksiyonunun sınıftaki yeri
—-
ve bu sınıfı yazmamdaki amacım olan grid();

verdiğiniz mysql data source nesnesini tabloya dönüştürme özelliğine sahip olan bu fonksiyona yardımcı bi kaç fonksiyonumuz da var.

örnek bir uygulama yapalım:

0
1
2
3
4
5
6
 $db = new D3Sql;
  $db->baglan('localhost','root','12345');   // mysql bağlantısını sağladık.
  $db->dbsec('deneme_veritabani');  // Vertabanı seçtik
 
  $db->sql('select id,adi,adresi FROM uyeler');  //Sorgumuzu Yazdık
 
   echo  $db->grid();  // Tabloyu ekrana yazdırdık.

çıktısı şuna benzer bişey olur

—- ————– ——————-
id            adi             adresi
—– ————– ——————
1          Tufan          tufyta.com
2         turkPHP     turk-php.com

 

peki biz her zaman böyle basit tablolar mı yapıcaz  ?    şimdi gelelim  bu tabloyu özelleştirmeye

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$db->tablo_ozellikleri=array(
'width'=>'600',
'cellspacing'=>'0',
'cellpadding'=>'0'
);   
 // bunun gibi istediğimiz kadar özelliği ekleyebilirz.  style="" gibi height gibi hepsni 
 
 
 
 $db->sutun_template();//  gridde en con işinize yarayacak olan fonksiyondur
 
// örneğin  'adresi'  Sutunu için   link verdirelim.$db->sutun_template('adresi','{$adresi}');
 
//artık adresi sütunumuz   yukardaki görüntüye göre yeniden inşa edilir ve her satır için bu uygulanır.

daha bir coooook özelliğini de kullandıkça yararlı gördükçe anlatıırım. kalın sağlıcakla