2012-02-28 2 views
1

私は、コメントの種類とその合計をmySQLデータベースから取得しています。 TOTAL
0 - - NAME - GENERAL - 4
3 - 有意義 - 9
4 - MISC - 私の出力で5このmysqlの結果を効率的にグループ化、合計、ソートするにはどうすればいいですか?

端に

ID:結果セットは次のように見えますしかし、私は総称してMISC、ID 0と4の合計を合計したいと思います。これを効率的にどのように行うべきですか?私が見ている問題は、すべての結果にID 0がない可能性があり、ID 4について同じことではないということです。

何か提案がありますか?

私のクエリは次のとおりです。

​​

だから私のエンドユーザーの結果は次のようになります。

GENERAL/MISC - 9
有意義 - 9

+0

これを生成するクエリは何ですか? –

+0

結果行にexixstがない場合、TOTALは0です。 – Narek

答えて

1

私はあなたとMySQLにそれが簡単に作成し、このようにそれを分割します:

(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, b.vch_name as NAME 
FROM comments a 
JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X AND a.fk_type_id <> 0 AND a.fk_type_id <> 4 
GROUP BY a.fk_type_id) 
UNION ALL 
(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, 'GENERAL/MISC' as NAME 
FROM comments a 
JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X AND (a.fk_type_id = 0 OR a.fk_type_id = 4) 
GROUP BY a.fk_type_id) 

我々は唯一のタイプのコメントをカウントしているので、私はJOINにごLEFT JOINを変更しました。

あなたは「MISC」タイプすることによって、fk_type_idのインデックスを仮定して、このクエリを向上させる可能性がある「1」の代わりにタイプの「4」、あなたの代わりにa.fk_type_id <> 0 AND a.fk_type_id <> 4a.fk_type_id < 2の代わりに、(a.fk_type_id = 0 OR a.fk_type_id = 4)とa.fk_type_id > 1ような何かを行うことができるように。

行をスキャンする代わりにインデックスを使用する場合、異なる結果を返す2つの個別のクエリを実行しても、パフォーマンスには影響しません。

0

これは合計します一般およびMISCの複数のエントリ

カスタム new_nameフィールドを書き込むこと

SELECT 
    IF(name = 'GENERAL' OR name = 'MISC', 'GENERAL/MISC', name) new_name 
    , SUM(total) 
FROM 
    comments 
GROUP BY 
    new_name 

から

+0

しかし、私は他の潜在的なIDも返さなければなりません。上記の例では、エンドユーザーがGENERAL/MISC-9、MEANINGFUL-9 – Mike

+1

@Mikeを表示していますが、元のクエリを実行して、GeneralとMiscの合計を追加してみませんか? – Brian

2

は、この文字列で検索してください。

関連する問題