2017-02-23 10 views
0

(TikiWiki CMS、トラッカーアプリケーションで)特定の値に対応する行をカウントするために、自己結合表に要約を作成しています。しかし、私は、同じ値を持つことができる2つの列がある場合があり、最初の非NULL値を特定の順序で取得するSQLが必要です。ここでWHERE文でCOALESCEまたはIFNULLを使用してNULL以外の値を選択します。

は、私が仕事テーブルtiki_tracker_item_fieldsの例である:

itemId | fieldId | value 
========================== 
41  | 236  | Paris 
41  | 213  | Paris 
14  | 236  |   
14  | 213  | Paris 
25  | 236  | Paris  
25  | 213  |  

私はどちらかのフィールドIdを236またはフィールドID 213で、値として「パリ」を持っているすべての行をカウントするクエリで。ここでの結果は次のようになります。私の要求がある3.

SELECT COUNT(*) AS sp_actions   
FROM          
    `tiki_tracker_item_fields` AS actions 
WHERE         
    COALESCE(        
    actions.fieldId = 236,    
    actions.fieldId = 213    
)          
AND actions.value = 'Paris'     

だからこれは私がフィールド236は「パリ」を持っているときに動作しますが、ではない私は、フィールド21のためのパリを持っている場合3.

私はこのようにCOALESCEを使うことさえできません。私が見つけたすべての例は、SELECT文にCOALESCEを入れました。

そして、パフォーマンスの問題がある...

答えて

2

あなたはcasecount (distinct)を使用することができます。

select 
    count(distinct case when value = 'Paris' then itemId end) cnt 
from `tiki_tracker_item_fields` 
where fieldId in (236,213); 
+0

グレート!魅力のように動作し、高速です。ありがとう!今私は、あなたの例の周りに私の心を包んで、特にそれがどのように動作するのかを理解する必要があります。 –

+0

また、WHERE文で制御フロー関数を使用することが可能かどうかを知りたいのですが... –

関連する問題