I am working with a MySQL query which I want to sort by best match. But it's not sorting results as needed.
My Data
Table Name : my_table
Datas :
+----+----------------------------------+
| id | name |
+----+----------------------------------+
| 01 | Sayed Mahbubul Alom |
+----+----------------------------------+
| 02 | Syed Masud Alom |
+----+----------------------------------+
| 03 | Shofiul Alom |
+----+----------------------------------+
| 04 | Lieutenant Colonel Mohammod Alom |
+----+----------------------------------+
My search keyword
$keyword = 'colonel alom';
Separated Keyword
$single_keyword = explode(" ", $keyword);
print_r($single_keyword);
array
(
0 => 'colonel',
1 => 'alom'
)
My SQL Query
$query = SELECT name FROM my_table
WHERE
name LIKE '%$keyword%' OR";
foreach ($single_keyword as $single) {
$query = $query." name LIKE '%$single%' OR";
}
$query = substr($query,0,-3); // To remove the last OR
$query = $query." ORDER BY
CASE
WHEN name LIKE '$keyword' THEN 1";
if (count($single_keyword ) > 1) {
$keyword_count = count($single_keyword);
$query = $query." WHEN";
for ($i = 0; $i < $keyword_count; $i++) {
$query = $query." name LIKE '$single_keyword[$i]' AND";
}
$query = substr($query,0,-3); // To remove the last AND
$query = $query." THEN 2 ELSE 3";
} else {
$query = $query." ELSE 2";
}
$query = $query." END";
My query generating this SQL
SELECT name FROM my_table
WHERE
name LIKE '%colonel alom%' OR
name LIKE '%colonel%' OR
name LIKE '%alom%'
ORDER BY
CASE
WHEN name LIKE 'colonel alom' THEN 1
WHEN name LIKE 'colonel' AND name LIKE 'alom' THEN 2
ELSE 3
END
The result I am getting is
+-------+----+----------------------------------+
| index | id | name |
+-------+----+----------------------------------+
| 0 | 02 | Syed Masud Alom |
+-------+----+----------------------------------+
| 1 | 01 | Sayed Mahbubul Alom |
+-------+----+----------------------------------+
| 2 | 03 | Shofiul Alom |
+-------+----+----------------------------------+
| 3 | 04 | Lieutenant Colonel Mohammod Alom |
+-------+----+----------------------------------+
But I want the 4th index as 1st index. How to achieve this?