【问题标题】:SQL search query (using LIKE) giving priority for columnSQL 搜索查询(使用 LIKE)为列提供优先级
【发布时间】:2013-08-08 11:46:56
【问题描述】:

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

id | title | body | accepted | deleted

一旦用户输入一个单词,如果 titlebody 在这些帖子中,将建议匹配数据库的 6 帖子。

我想要做的是优先考虑那些在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'); 

【问题讨论】:

  • 我不知道如何在 codeigniter 中执行此操作,但我知道如何在 sql 中执行此操作,也许这会对您有所帮助:SELECT id, title, body FROM posts WHERE title LIKE '$seached_text' OR body LIKE '$seached_text' ORDER BY IF( title LIKE '$seached_text', CONCAT(1,'$seached_text'), CONCAT(2,'$seached_text') ) 这就是我没有将其发布为答案的原因
  • 似乎ifcase 不能用作活动记录。
  • 您有 2 个选择:1. 执行 SQL 查询 2. 在执行 codeigniter 查询后对结果进行排序

标签: php mysql database codeigniter activerecord


【解决方案1】:

这是 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

在这种情况下,首先在titlebody 中的行都有{KEY},然后行在title 内有{KEY},最后是@987654328 @在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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2010-10-02
    • 2010-09-08
    相关资源
    最近更新 更多