2016-12-08 6 views
0

私は、国レベルから店舗レベルまで階層的に構成された製品の価格を格納するテーブルを持っています。具体的なものから一般的なものを大きなルールセットから検索

create table price_list(
product_id number, 
country_id number, 
region_id number, 
store_id number, 
price number 
) 

この表を検索して請求書を生成する必要があります。 (ここでは詳述しない)関数の入力は、(私が説明するために、JSON構造を使用します)、このパターンである:

{ 
    header : {country_id:5, region_id:234, store_id:345}, 
    items : { 
     0:{product_id:1001, quantity:5}, 
     1:{product_id:299, quantity:1} 
     //, etc... 
     } 
} 

私はその店のセットアップに固有の製品の価格を取得したいです。

もちろん、すべてのフィールドが満たされていれば、完全な選択構文を使用して価格を検索できます。

select price from price_list where product_id = ? and country_id = ? and region_id = ? and store_id = ? 

しかし、価格はその国のすべての地域や店舗でその製品のために同じであるため、テーブルのフィールドには、たとえばだけCOUNTRY_IDとのproduct_idが満たされている、不完全である場合があります。私は、技術的でない理由のために、すべてのデータに完全なフィールドを設定したくないとしましょう。表のサンプルデータを以下に示します。

product_id country_id region_id store_id price 
1001   3    93   112   15 
1001   3    93   113   15.5 
1001   4    179      14 
1001   4    185      13 
1001   5          20 
1001   5    999   999   25 

のは、私はこの要求を実行するために

{ 
    header : {country_id:5, region_id:300, store_id:500}, 
    items : { 
     0:{product_id:1001, quantity:5}, 
    } 
} 

をしたい場合は、国5地域999店舗を除く各地域、各ストアの特定の価格を指定していないので、このクエリが結果を返さない例を見てみましょう999

select price from price_list where product_id = 1001 and country_id = 5 and region_id = 300 and store_id = 500 

何行が返されないので、私は何の価格が見つからない場合は、1つずつ減らし、すべてのフィールドを使用して開始し、検索を一般化する必要があります。

where product_id = 1001 and country_id = 5 and region_id = 300 

しかし、これでも行は返されません。それから私はより一般化し、この検索は価値を得ます。

where product_id = 1001 and country_id = 5 

私の現在の解決策は網羅的です。これを効率的に行うためのよりよい方法はありますか?環境は、PHP 5.4およびCodeIgniter2のOracle 11gです。

答えて

0

where句保持する変数を作成ないのはなぜ:

$priceWhereclause = ""; 
$params = []; 

if(isset($productIdValue)){ 
    $priceWhereclause .= "product_id = ? "; 
    $params[] = $productIdValue; 
} 

if(isset($countryIdValue)){ 
    $priceWhereclause .= "and country_id= ? "; 
    $params[] = $countryIdValue; 
} 

をあなたのクエリは次のようになります。

select price from price_list where $priceWhereclause

execute($params)機能で$paramsを置きます。

+0

明確でないことを申し訳ありませんが、私は質問を更新しました。私はすべての値が常に要求に設定されているので、問題はクエリにないと思います。問題は、どのように検索に近づくべきかということです。 たとえば、国5地域999と店舗1000の商品1001がある場合、「product_id = 1001、country_id = 5、region_id = 999およびstore_id = 1000」を入力することはできません。 これは 'where product_id = 1001 and country_id = 5'でのみ有効です –

+0

'(country_id = 5 AND store_id = 100)OR(country_id = 6 AND store_id = 110) 'を包むようにします – Daan

+0

私は ' SELECT price FROM price_listどこproduct_id =ですか? AND(country_id =?またはcountry_idはNULL)AND ... ORDER BY country_id ASC NULLS LAST、... ' –

関連する問題