2012-02-03 14 views
1

これは数回質問されている質問です。私は見つけることができません。私の特定のデータセットに合った解決策...(ほとんどの場合、初心者レベルのために、クエリのさまざまな要素を注文する際の構文の意味を完全には理解していない可能性があります)。1つのクエリに2つ(または3つ)のカウントがあるMYSQL(via phpmyadmin)

私は、単一の結果として生じるテーブルに2つの「数」を実行しようとしている - 私はちょうど罰金個々のテーブルを取得することができます - 結果を集計することができるということは、非常に私の分析をスピードアップするでしょう。..

特定クエリは、次のとおり

(1)

SELECT `PUID`,`DROID_V`,`SIG_V`,`SPEED` 
    , COUNT(distinct NAME) as NoExt 
FROM sourcelist, main_small 
WHERE sourcelist.SourcePUID = 'MyVariableHere' 
    AND main_small.NAME = sourcelist.SourceFileName 
    AND sourcelist.hasExtension = 0 
GROUP BY `PUID`,`DROID_V`,`SIG_V`,`SPEED` 
ORDER BY `DROID_V` ASC, `SIG_V` ASC, `SPEED`; 

及び(2)

SELECT `PUID`,`DROID_V`,`SIG_V`,`SPEED` 
    , COUNT(distinct NAME) as Ext 
FROM sourcelist, main_small 
WHERE sourcelist.SourcePUID = 'MyVariableHere' 
    AND main_small.NAME = sourcelist.SourceFileName 
    AND sourcelist.hasExtension = 1 
GROUP BY `PUID`,`DROID_V`,`SIG_V`,`SPEED` 
ORDER BY `DROID_V` ASC, `SIG_V` ASC, `SPEED`; 

私がやりたいことは可能であるならば、私は本当に私が第三のカウントをimplimentことができるかどうかを確認したいと思います:

(3)

SELECT `PUID`,`DROID_V`,`SIG_V`,`SPEED` 
    , COUNT(distinct NAME) as All 
FROM sourcelist, main_small 
WHERE sourcelist.SourcePUID = 'MyVariableHere' 
    AND main_small.NAME = sourcelist.SourceFileName 
GROUP BY `PUID`,`DROID_V`,`SIG_V`,`SPEED` 
ORDER BY `DROID_V` ASC, `SIG_V` ASC, `SPEED`; 

誰かが私を選択解除することができるかもしれませんかしら私が欲しいものがあれば教えてください.3つの共通の要素があります(テーブル、グループ条件、注文の詳細)。違いはWHERE条件です。

2つのカウントクエリでもnull値があり、カウントAはカウントBとは異なるセットになります - したがって、カウントが同じ基本シェイプになる必要があるかどうかは疑問でした(つまり、ちょうど別のカウント値ではなく、特定の行はカウントのいずれかのヌルリターンが得られビルドをカウント)

答えて

3

(1)&(2)あなたはCOUNT(distinct IF(.., .., ..))構文を使用して、hasExtensionにWHERE条件を削除することができます結合するには、

SELECT `PUID`,`DROID_V`,`SIG_V`,`SPEED`, 
    COUNT(distinct IF(sourcelist.hasExtension=1,NAME,NULL)) as Ext, 
    COUNT(distinct IF(sourcelist.hasExtension=0,NAME,NULL)) as NoExt, 
    COUNT(distinct NAME) as `All` 
FROM sourcelist, main_small 
WHERE sourcelist.SourcePUID = 'MyVariableHere' AND main_small.NAME = sourcelist.SourceFileName 
GROUP BY `PUID`,`DROID_V`,`SIG_V`,`SPEED` ORDER BY `DROID_V` ASC, `SIG_V` ASC, `SPEED`; 
+0

魅力的な作品 - あなた、S ir/Ladyは、紳士と学者です。ありがとうございました。興味深いことに、IF文のNULL句は何をしていますか? – Jay

+0

これは、 'COUNT'が何もカウントしないようにしています。例えば、' SUM(IF(hasExtension、1,0))hasExt'は拡張子を持つ場合は1を、そうでない場合は0を追加します。 'NULL 'は' COUNT'の場合は0に似ています。(gotcha: 'COUNT(0)'はカウンターを引き継いでいるという点で 'COUNT(NAME)'と同じです!私がSUMの代わりに 'COUNT'を使用したのは、' DISTINCT 'を 'SUM'に組み込む方法がわからないからですが、あなたは' DISTINCT 'を 'COUNT'に入れることができます。 –

+0

OK、私は理解していると思います。私は戻り値を見て、パラメータの意味をよりよく理解することができます。さて、これはすでに、多くのユーザーに影響を与える非トライバル開発問題の正確な例を見つけるのに役立っています。驚くばかり。ありがとうございました。 – Jay

関連する問題