2

以下は私の2つのクエリで、左結合の結果をもう1つ追加するだけで混乱します。2番目のクエリ結果は正確ですが、1番目のクエリで左結合の出力をもう1つ追加すると、正しくありません(ご覧のとおり、左結合を1つだけ追加しましたが、その結合のフィルタリングをwhere句に入れませんでした)。どうすればこれを修正できますか?ありがとう、

最初のクエリ:

SELECT Distinct  count(event_id) as event_count from events 
Left Join events on events.event_id = my_events.i_event_id 
Left Join atdees on events.event_id = atdees.fk_event_id

where my_events.v_title != "NULL" and  r_present = 1 and resident_id = '208'  and event_atd > date_sub(curdate(), interval 37 day) group by event_count  order by event_count desc limit 5

結果:

26  |  12   |  11   |   10

2番目のクエリ:

SELECT Distinct  count(event_id) as event_count from events 
Left Join events on events.event_id = my_events.i_event_id 

where my_events.v_title != "NULL" and  r_present = 1 and resident_id = '208'  and event_atd > date_sub(curdate(), interval 37 day) group by event_count  order by event_count desc limit 5

結果:

2  |  1   |  1   |   1
4

2 に答える 2

2

左結合が行うことは、余分な(重複した)行を追加することです。

を削除してcount行を一覧表示すると、重複する行が多数表示されます。これは、と
の間の外積を求めているためです。そしてもちろん、イベントと参加者の組み合わせはもっとたくさんありますが、イベントだけがあります。eventsatdees

本当に基本的なロジック。

上位のクエリをに変更します

SELECT count(distinct event_id) as event_count from events 
Left Join events on events.event_id = my_events.i_event_id 
Left Join atdees on events.event_id = atdees.fk_event_id

where my_events.v_title != "NULL" and  r_present = 1 and resident_id = '208'
and event_atd > date_sub(curdate(), interval 37 day) 
group by event_count  
order by event_count desc 
limit 5

そして、あなたは同じ結果を得るはずです(これははるかに遅いですが)

さらに、left joinsはフィルタリングせず、何かを追加することに注意してください。フィルタリングする場合は、 s
を使用します (これは非常に単純化されています)inner join

Aboutdistinct
キーワードは、集計関数 のdistinct内外で機能します。内部で使用する場合は、一意の値(合計など)のみがカウントされます。集計関数の外部で使用すると、一意の行のみが一覧表示されます。

つまりdistinct、それ自体で重複行を排除します(結果セットのすべての列で機能します)。

distinct関数内は、その関数のフィルターとしてのみ機能します。

于 2012-12-19T15:13:52.077 に答える
1

COUNT(DISTINCT)ではなく、を使用してくださいDISTINCT COUNT()

SELECT count(distinct event_id) as event_count from events 

COUNT(DISTINCT)行数ではなく、個別の値の数をカウントします...を追加するとLEFT JOIN、行数が増え、の結果が変わりCOUNT()ます。

また、GROUP BY...を再確認することもできます。集計関数でグループ化するのは意味がありません。

于 2012-12-19T15:13:22.947 に答える