2009-06-05 20 views
1

私は現在の週の日数を数えようとしていますが、それに関連付けられているイベントはありませんが、それを行う方法はわかりません。 、行がないときにこれをどのように数えることができますか?

SELECT COUNT(e.event_id) FROM cali_events e 
LEFT JOIN cali_dates d 
ON e.event_id = d.event_id 
WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 

しかし、私は、個々の日をカウントし、0を返す日を合計することによって日数をカウントする方法を知っている:

は例えば、私はこのクエリで今週起こったイベントの数をカウントそれはあまりエレガントではありません。

1つのクエリでどのように行うことができますか?

+0

してグループを追加するのを忘れデータ挿入文? –

答えて

10

このクエリは、サブクエリを使用して、結合されたテーブル内のすべての一意の日付を検索します。その後、固有の日付の数が7から減算されますか?

--assuming a 7 day week; no mention in the request about workweek. 
     SELECT 7 - COUNT(*) AS NumDaysWithoutEvents 
     FROM  
     (SELECT DAY(d.date) 
      FROM cali_events e 
      LEFT JOIN cali_dates d 
      ON e.event_id = d.event_id 
      WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
      GROUP BY DAY(d.date) 
     ) AS UniqueDates 
+0

その返品の10 6の...イベントが7つあり、イベントがない場合は3日間です。 – Malfist

+0

今、私は-3の1列を得る! – Malfist

+0

これはDATETIMEなので、d.dateによるグループ分けは役に立たず、同じ日にあっても別の時間が割り当てられます。 – Malfist

1

これは、可能な日数/週/何でもテーブルを作成し、&と一致しないテーブルに参加する「価値テーブル」の場合に該当する場合があります。

-1

DatesテーブルとEventsテーブルはありますか?

event_idは、イベントがあった場合にのみDatesテーブルに表示されますか?

もしそうなら、あなたは単にINNER JOINをすることができませんでしたか?

1

興味のある時間枠内にイベントが存在する別の日付を検索するクエリを作成できませんでしたか?

0

これはうまくいくと思いますが、HAVINGを使用する解決策もあると思います。

SELECT COUNT(*) FROM 
    (SELECT d.date, count(*) as event_count 
    FROM cali_dates d 
     LEFT JOIN cali_events e ON d.event_id = e.event_id 
    WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
    GROUP BY d.date) t 
WHERE t.event_count = 0 

編集内容:これは、d.dateに時間部分がないことを前提にしていますが、これに対応するのは簡単です。 cali_datesには、毎週の曜日のレコードが含まれていることも前提としています。

+0

は0を返し、3を返します。 – Malfist

0

周りのクエリを裏返し、レコードがevent_idのためcali_eventsに存在しない場合cali_datesから選択します。あなたのCali_Datesテーブルを想定し

select count(*) 
    from cali_dates d 
where not exists(select * 
        from cali_events e 
        where d.event_id = e.event_id) 
    and YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
+0

は0を返し、3を返します。 – Malfist

0

は週に毎日の行を持っていますCali_Datesから

現在の週では、Cali_Events表にNULL(イベントなし)を持つすべての行を検索します。

編集:

SELECT sum(case when e.event_id is null then 1 else 0 end) 
FROM cali_dates d 
LEFT JOIN cali_events e 
ON e.event_id = d.event_id 
WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
GROUP BY d.date 

そうでない場合、あなたはpcambellの答えのように、一週間の日数を宣言する必要があるだろう、あなたのDDLとサンプルを投稿することができます

関連する問題