0

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?

Bearded
  • 45
  • 8

0 Answers0