Ader org tanya aku pasal nak buat carian nama berdasarkan lebih dari satu keyword dan nak result tu disusun mengikut priority carian tersebut.
kata kan mencari nama manaf osman
nama yang akan keluar :
manaf bin osman
manaf abdul osman
manaf gazali osman
manaf hashim osman
abdul manaf
daud manaf
osman manf
Jadi aku try la buat satu query untuk sort carian tu. Idea dia,
1. Carik location carian tu berlaku untuk setiap keyword.
2. Kalau result location dia 0 (x jumpa), kene jadikan value dia paling tinggi.
3. Left pad kan result dengan kosong di hadapan, max aku pakai 7 digit
4. CONCAT semua result carian.
5. CAST result yang dah di CONCAT kepada nilai integer.
6. Susun mengikut hasil pada no 5.
Ni contoh query yang aku dah buat.
SELECT * FROM (
SELECT CAST(CONCAT(LPAD(BBPos1,7,'0'),LPAD(BBPos2,7,'0')) as UNSIGNED) as Position,CC.* FROM (
SELECT IF(Pos1=0,999999,Pos1) as BBPos1,IF(Pos2=0,999999,Pos2) as BBPos2,BB.* FROM (
SELECT LOCATE('mohd',namapenuh) as Pos1,LOCATE('HJ',namapenuh) as Pos2,AA.* FROM (
SELECT * FROM ahli WHERE namapenuh LIKE '%mohd%'
UNION
SELECT * FROM ahli WHERE namapenuh LIKE '%HJ%'
) as AA
) as BB
) as CC
) as DD ORDER BY Position,namapenuh
Ni kira math dan logik kena power gak la. Macam ninja.
Nin.. Nin..
Hemo... Hemo..