2017-09-01 20 views
1

私は4列のテーブルを持っています。私は入力に基づいて行を表示すると、優先順位フィールドに従って優先順位を表示できる必要があります。結果に優先順位をつける方法

例:私のテーブルは次のようになります

私はそれがどのように動作するかを以下の私のテストケース持って
ID title   description tags 
1 web developer designer  front-end 
2 designer  front-end  web developer 
3 front-end  web developer designer 

:今

$input = 'web developer' // the sequence should be IDs : 1, 3, 2 
$input = 'front-end'  // output sequence result is : 3, 2, 1 
$input = 'designer'  // result sequence : 2, 1, 3 

が、私はタイトルからダウンタ​​グに結果を優先させたいです入力に基づいています。

$blog = DB::('blogs') 
     ->where('title', 'LIKE', '%$title%') 
     ->where('description', 'LIKE', '%$title%') 
     ->where('tags', 'LIKE', '%$title%'); 

しかし、上記のコード、あなたがその列に基づいてIDを選択することができ

$input = 'web developer'; 

$byTitle = DB::('blogs') 
      ->where('title', 'LIKE', '%$input%') 
      ->select('id'); 

$byDescription = DB::('blogs') 
       ->where('description', 'LIKE', '%$input%') 
       ->select('id'); 

$byTag = DB::('blogs') 
     ->where('tag', 'LIKE', '%$input%') 
     ->select('id'); 

$ids = $byTitle->union($byDescription)->union($byTag)->get(); 

、それは

答えて

1

ない良い解決策..ませんでしたが、これはあなたを助けるかもしれないようですそれらの組合はデータを取得する。ここで

は、あなたがUNIONを経由してこれを処理したい場合は、生のクエリは次のようになります。ここ

SELECT ID, 1 AS priority 
FROM blogs 
WHERE title = 'web developer' 
UNION 
SELECT ID, 2 
FROM blogs 
WHERE description = 'web developer' 
UNION 
SELECT ID, 3 
FROM blogs 
WHERE tags = 'web developer' 
ORDER BY 
    priority, 
    ID 

1つの警告は、もし与えられたレコードは、タイトルの2つ以上の同じ値を持っていたということです、description、またはtagsの列を使用すると、結果セットに重複レコードが表示されることになります。オリジナルのデータから、これは起こっているようには見えませんが、これは言及する価値のあるケースです。

+0

あなたがロジックの男を持っていますが、私はあなたが私はあなたにも 'ORDERが必要だと思う – smzapp

+0

データの何百万を持っていますならば、これはあまりにも遅い動作すると思いますBY'これを行うにはここに句を入れてください。 'UNION'クエリに計算カラムを追加して、各サブクエリを追跡し、最後にそのカラム順に並べ替えることができます。 –

+0

@サミュエルはい、絶対に言えば、私は "良い解決策ではない"と言いました。 –

4

結果を注文したいロジックがORDER BY句に表示されているはずです。次の生のクエリを考えてみましょう:

SELECT * 
FROM yourTable 
ORDER BY 
    CASE WHEN title = 'web developer'  THEN 0 ELSE 1 END, 
    CASE WHEN description = 'web developer' THEN 0 ELSE 1 END, 
    CASE WHEN tags = 'web developer'  THEN 0 ELSE 1 END; 

出力:

enter image description here

ここではLaravelコードがorderByRawを使用してどのようになるかで私の試みです:

$orderByClause = "CASE WHEN title = '".$input."' THEN 0 ELSE 1 END,"; 
$orderByClause .= "CASE WHEN description = '".$input."' THEN 0 ELSE 1 END," 
$orderByClause .= "CASE WHEN tags = '".$input."' THEN 0 ELSE 1 END" 

$blog = DB::('blogs') 
     ->orderByRaw($orderByClause) 
     ->get(); 

私はcouldn orderByRawをどのようにパラメータ化するかについての(作業中の)ドキュメントを見つけることはできませんが、私は代わりに文字列連結を使用しました。ここ

デモ:

Rextester

関連する問題