4

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'); 
4

1 に答える 1

4

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 デモ

この場合、行にはinと{KEY}in の両方が最初にあり、次に行のすぐ内側に thierがあり、最後にinがある行があります。titlebody{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();
于 2013-08-08T12:38:44.523 に答える