2011-07-13 3 views
2

私は、単純なSQLクエリを持っている:MYSQL:GROUP BYは0以外のすべての値にNULLを設定しますか?

SELECT tid, 
     COUNT(*) AS bpn 
    FROM mark_list 
    WHERE userid = $userid 
GROUP BY tid 

は今列tidは、基本的には、各エントリに関連付けられているカテゴリリストです。カテゴリは固有の数値です。

useridごとにいくつのレコードがあるのか​​を全体的にカウントしていますが、カテゴリ全体を1回だけカウントしたいだけです(カテゴリ3に10000レコードがある場合、 1)。

カテゴリがnullまたは時には0としてリストされていることがあります。項目に0またはNULLがある場合はカテゴリがなく、それらを独自の別のエンティティとしてカウントしたい単一の大きなカテゴリ。

+3

、 COUNT(*) 'COUNT(DISTINCT tid)'のようなものを試してください。 –

答えて

3

Wheeee!

SELECT SUM(`tid` IS NULL) AS `total_null`, 
     SUM(`tid` = 0) AS `total_zero`, 
     COUNT(DISTINCT `tid`) AS `other` 
    FROM `mark_list` 
WHERE `user_id` = $userid 

編集:注意total_zeroが0より大きい場合、あなたは(TID = 0は、その列にカウントされますので)「その他」の結果から1を減算する必要があること

代わりに `TIDの
+1

MySQLの予約語ではない列/テーブルにバッククォート( ')を使用する必要はありません。 –

+3

emは必要ありませんが、すべての識別子のまわりでそれらを使用するのがベストプラクティスです! – TehShrike

+1

いいえ、常にエラーを隠すバッククイックを使用するのはベストプラクティスではありません。彼らはあなたが**使用してはならない言葉を逃れるために存在します... –

2

これらの特定の値(WHERE句を使用)を考慮しないようにクエリを変更し、おそらくこれらの値を考慮に入れた個別のクエリを実行できます。

これを1つのクエリにまとめる方法があるかもしれませんが、この方法でもうまくいくはずです。

関連する問題