我正在使用CodeIgniter和活动记录。我有posts
表:
id | title | body | accepted | deleted
用户输入某个字词后,如果该帖子位于这些帖子的6
或title
内,则会建议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');
答案 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();