2016-05-26 7 views
3

「esta」グループごとに蓄積された項目数を示す一連の結果を取得する必要があります。MySqlのグループごとの結合項目数

結果をグループ化しています。

Establishmentはベースに内部結合されています。

左に結合されたアイテムは、ベースに対して結合されます。

したがって、Estaグループ2では、3つのベースIDがあるとします。ベースIDに添付された各書面および口頭のレコードは、結果セット内のそのエスタにカウントされます。 各基本レコードに複数の「書面」または「口頭」を付けることができます。

私はデータベースに6つの逐語と4つのwrittensを持っていますが、それらは異なる 'esta'レコードに広がっています。私の質問では、彼らはすべて私が得た結果の最初の行に向かっています。

私はずっと多くのデータで同じことを試していますが、 'esta'に関係なく、最初の行にはすべての左結合要素が一緒に数えられます。

SQL:

SELECT 
    esta.enf_esta_id 
    ,SUM(IF(verbal.enf_verbal_id is not null,1,0)) as verbals 
    ,SUM(IF(written.enf_written_id is not null,1,0)) as writtens 
FROM 
    enf_base base 
      INNER JOIN enf_esta esta ON esta.enf_esta_id = base.enf_esta_id 
      LEFT JOIN enf_verbal verbal ON verbal.enf_base_id = base.enf_base_id 
      LEFT JOIN enf_written written ON written.enf_base_id = base.enf_base_id 
WHERE 
    1=1 
GROUP BY 
    esta.enf_esta_id 

結果:

enf_esta_id verbals writtens 
2   10  10 
3   1  0 
4   1  1 
6   0  0 

一番上の行が間違っていることを証明するために、ここだけenf_esta_id 2.

SELECT 
    COUNT(*) AS total 
FROM 
    enf_written 
     INNER JOIN enf_base ON enf_base.enf_base_id = enf_written.enf_base_id 
     INNER JOIN enf_esta ON enf_base.enf_esta_id = enf_esta.enf_esta_id 
WHERE 
    enf_esta.enf_esta_id =2 
からverbalsとwrittensを得るための結果があります

収量:

5 

また、enf_verbalと同じ結果が得られます2.問題の照会結果の一番上の行を割り引くと、それぞれの合計を合計すると正しい10が得られます。

誰でも私が必要とする結果を得るのを助けることができますか?

+0

あなたはesta.enf_esta_idしか持っていませんか? – b1n0ys

+0

エスタは多くの基盤を持っていますが、それが理にかなっていれば、多くの言葉に書かれています。インスタントで口頭/書いた数を探しています – blodey

+0

しかし、それは多くの拠点がエスタであり、あなたがエスタごとに1つの結果行を取得するようにグループ化した場合、結果に「ベース」IDをどのように表示できますか?あなたはどちらを見せたいですか?たぶんestaごとのベースIDのリスト?または、ベースIDをまったく表示する必要がありますか? –

答えて

1

あなたは掛け合っています。 2つの動詞と5つの文があり、あなたの結合がこれらの10のレコード(つまりすべての組み合わせ)を作るとします。テーブルを結合して集計するのではなく、最初に集計して集計に追加する必要があります。あなたのケースでは、これはベースIDごとの集計です。最終的に集計してestasを取得します。

select 
    base.enf_esta_id, 
    coalesce(sum(verbal.cnt), 0) as verbals, 
    coalesce(sum(written.cnt), 0) as writtens 
from enf_base base 
left join 
(
    select enf_base_id, count(*) as cnt 
    from enf_verbal 
    group by enf_base_id 
) verbal on verbal.enf_base_id = base.enf_base_id 
left join 
(
    select enf_base_id, count(*) as cnt 
    from enf_written 
    group by enf_base_id 
) written on written.enf_base_id = base.enf_base_id 
group by base.enf_esta_id; 
+0

はありがとう、私は完全に今の問題を理解し、道あなたを得る\t enf_base_id' をenf_base_idそれを記述している! – blodey