SQL搜索查询(使用LIKE)为列提供优先级

时间:2013-08-08 11:46:56

标签: php mysql database codeigniter activerecord

我正在使用CodeIgniter和活动记录。我有posts表:

id | title | body | accepted | deleted

用户输入某个字词后,如果该帖子位于这些帖子的6title内,则会建议body个匹配数据库的帖子。

我想要做的是优先考虑那些在title内拥有该词组的帖子,而这些帖子仅限于body。怎么做?

$query = $this->db->select('id,title,body')
->from('posts')
->where(array('accepted'=>'1'))
->where(array('deleted'=>'0'))
->like('title', $seached_text)
->or_like('body', $seached_text)
->limit(6)
->order_by('title','asc'); 

1 个答案:

答案 0 :(得分:3)

这是SQL查询:

SELECT id, title, body
  FROM posts
  WHERE title LIKE '%{KEY}%' OR body LIKE '%{KEY}%'
  ORDER BY CASE
    WHEN (title LIKE '%{KEY}%' AND body LIKE '%{KEY}%') THEN 1
    WHEN (title LIKE '%{KEY}%' AND body NOT LIKE '%{KEY}%') THEN 2
    ELSE 3
    END, title
LIMIT 0, 6;

<强> SQLFiddle Demo

在这种情况下,{KEY}title中的行首先出现body,然后行{KEY}就在title内},最后是{KEY}body的那些。

您可以使用以下命令在CodeIgniter中运行此查询:

$query = $this->db->query('YOUR QUERY HERE');

以下是一个例子:

$key = $this->db->escape_like_str($seached_text);

$sql = <<<SQL
SELECT id, title, body
  FROM posts
  WHERE accepted = '1'
    AND deleted = '0'
    AND (title LIKE '%$key%' OR body LIKE '%$key%')
  ORDER BY CASE
    WHEN (title LIKE '%$key%' AND body LIKE '%$key%') THEN 1
    WHEN (title LIKE '%$key%' AND body NOT LIKE '%$key%') THEN 2
    ELSE 3
    END, title
LIMIT 0, 6;
SQL;

$query = $this->db->query($sql);
$result = $query->result_array();