2011-12-07 15 views
0

これを2回カウントしないとより効率的な方法がありますか?mysqlのカウント比較文

つまり、カウントが0の場合は警告イメージ文字列を返し、そうでない場合はカウントを返します。

IF(
    ((SELECT COUNT(pc.category_id) from product_categories pc WHERE pc.product_id = cp.ItemID) > 0), 
    (SELECT COUNT(pc.category_id) from product_categories pc WHERE pc.product_id = cp.ItemID), 
    "<img src=\"_imgs/warning.png\" alt=\"warning\"/>" 
) AS category_count 

答えて

2

変数を使用します。 (しかし、私はその結果がクエリキャッシュによってキャッシュすることができると思います。)

IF(@val:=(query here), @val, "other value") AS category_count 
+0

ありがとうございました。あなたがmysqlで変数を使用できるかどうかわかりませんでした。 – user813720

0

あなたは例えば、NULLIFCOALESCEの組み合わせを使用することができます。

COALESCE(NULLIF((sub-query), 0), 'other value') 

ただし、データベースクエリにHTMLを作成しないでください。これは、複雑なSQLを必要とせず、これは単純なif文になります。

0

このテーブルに参加することもできます。 -

SELECT 
    cp.*, 
    IF(pc.cnt > 0, pc.cnt, '<img src=\"_imgs/warning.png\" alt=\"warning\"/>') 
FROM 
    cp_table cp 
    LEFT JOIN (
    SELECT product_id, COUNT(category_id) AS cnt FROM product_categories GROUP BY product_id 
) pc 
    ON pc.product_id = cp.ItemID 
0

シンプルはCOALESCEを使用します。 NULLIFは、2つの引数が同じ場合にNULLを返し、COALESCEはNULLに遭遇したときにデフォルト値を返すのに役立ちます。

select COALESCE(NULLIF(COUNT(pc.category_id),0),"<img src=\"_imgs/warning.png\" alt=\"warning\"/>") AS category_count