5

2つのテーブルがあります。そしてorganizer_id、2010年から2012年の間にすべてのイベントを開催したすべてのものが必要です。

event
--------- 
event_id
name
year


event_organizer
---------
event_id
organizer_id

私はこのようなことを試みました:

SELECT organizer_id 
  FROM event_organizer
 WHERE event_id IN (SELECT event_id 
                      FROM event 
                     WHERE year>=2010 AND year<=2012);

しかし、organizer_id2010年から2012年の間にすべてのイベントを整理したものだけが必要なため、機能しませんでした。クエリが希望どおりに機能するように見えるかどうかわかりません。

4

2 に答える 2

9

あなたは書ける:

SELECT t1.organizer_id
  FROM ( SELECT eo.organizer_id,
                COUNT(1) AS num_events
           FROM event_organizer eo
           JOIN event e
             ON eo.event_id = e.event_id
          WHERE e.year BETWEEN 2010 AND 2012
          GROUP
             BY eo.organizer_id
       ) t1
  JOIN ( SELECT COUNT(1) AS num_events
           FROM event e
          WHERE e.year BETWEEN 2010 AND 2012
       ) t2
    ON t1.num_events = t2.num_events
;

(上記の考え方は、主催者ごとに、2010年から2012年の間に開催されたイベントの数を調べます。次に、これを2010年から2012年のイベントの総数と比較します。これら2つの数が同じ場合、その後、主催者はその期間のすべてのイベントを開催しました。)

または、次のように書くこともできます。

SELECT organizer_id
  FROM organizer       -- I assume you have an 'organizer' table?
 WHERE organizer_id NOT IN
        ( SELECT o.organizer_id
            FROM event e
           CROSS
            JOIN organizer o
            LEFT
           OUTER
            JOIN event_organizer eo
              ON e.event_id = eo.event_id
             AND o.organizer_id = eo.organizer_id
           WHERE e.year BETWEEN 2010 and 2012
             AND eo.event_id IS NULL
        )
;

(これのアイデアは、主催者がイベントを主催しなかったようなすべてのイベントと主催者の組み合わせを見つけることです。次に、そのような組み合わせに表示されないすべての主催者を返します。)

于 2013-01-12T20:04:09.120 に答える
4

このようなクエリを実行する最も簡単な方法は、集計を使用することだと思います。

with events as (
    select event_id
    FROM event 
    WHERE year>=2010 AND year<=2012
)
select organizer_id
from event_organizer eo
where event_id in (select event_id from events)
group by organizer_id
having count(distinct event_id) = (select count(*) from events)
于 2013-01-12T20:58:45.393 に答える