如何使用CodeIgniter ActiveRecord将MySQL结果按字母顺序排序,但优先匹配搜索词?

10

假设我们在一个表格中有4个项目:

  1. Michel Jordan
  2. Tom Mark Jordan
  3. Jordan John
  4. Adam Jordan Robert

搜索词为“Jordan”,我该如何按字母顺序排序结果,但搜索词匹配的项目排在最前面,结果如下所示:

  1. Jordan John
  2. Michel Jordan
  3. Tom Jordan Robert
  4. Adam Mark Jordan

我正在使用这段代码,但没有得到我想要的结果:

$this->db->select('id, name');
$this->db->from('users');
$this->db->like('name', $search_term);
$this->db->order_by('name', 'asc');
$query = $this->db->get();

我认为在接收结果后,您需要在PHP中重新排序。如果您将名称拆分为不同的字段,则可以使其正常工作。 - swatkins
我在一个列中有完整的姓名。 - Waleed Asender
好的,我明白了。因此,您需要获取结果,然后重新对这些结果进行排序。 - swatkins
3个回答

10

试试这个:

SELECT id, fullName 
FROM test 
ORDER BY FIND_IN_SET('Jordan', REPLACE(fullName, ' ', ',')), fullName;

请查看此链接 SQL FIDDLE DEMO

输出结果

| ID |          FULLNAME |
|----|-------------------|
|  1 |       Jordan John |
|  2 |     Michel Jordan |
|  4 | Tom Jordan Robert |
|  3 |  Adam Mark Jordan |

看起来很不错,但我怎么能将它用作CodeIgniter查询呢?并且使用变量$search_term代替单词“Jordan”? - Waleed Asender
@WaleedAsender,我没有使用过CodeIgniter,对此感到抱歉,你需要自己完成它。 - Saharsh Shah
很不幸,由于某些原因它对我不起作用了! $query = $this->db->query("SELECT name FROM members ORDER BY FIND_IN_SET('$keyword', REPLACE(name, ' ', ',')), name")->result(); - Waleed Asender
你正在搜索 '$keyword',你需要确保变量通过以下方式插入到查询中:FIND_IN_SET('" . $keyword . "'... 这应该可以工作(在 PHP 中是正确的,但我不确定其他语言是否适用)。 - Steve P

6
你可以尝试这个方法:
$this->db
     ->select('id, fullName')
     ->from('test')
     ->order_by("FIND_IN_SET('Jordan', REPLACE(fullName, ' ', ',')) , fullName");
$query = $this->db->get();

它一直抛出这个错误: 发生了数据库错误 错误编号:1064您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式,位于第3行的 'fullName' 处。 - Waleed Asender
请确保在orderby子句中没有使用双引号。同时,fullname应该不带引号使用。 - Code Prank

0

我为您尝试:

$this->db->select('id, name, (SELECT name FROM users WHERE name REGEXP "^'.$search_term.'") as "regexp_match"');
$this->db->from('users');
$this->db->like('name', $search_term);
$this->db->order_by('name', 'asc');
$this->db->order_by("regexp_match", "asc");
$query = $this->db->get();

我知道看起来有点奇怪,但相信我,你想要使用正则表达式。 :D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接