Как я могу посчитать это, когда нет строк? - PullRequest
1 голос
/ 05 июня 2009

Я пытаюсь подсчитать количество дней текущей недели, с которыми не связано событие, но я не знаю, как это сделать.

Например, я считаю количество событий, происходящих на этой неделе, по этому запросу:

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, но это не очень элегантно.

Как я могу сделать это одним запросом?

Ответы [ 7 ]

10 голосов
/ 05 июня 2009

Этот запрос использует подзапрос, чтобы найти все уникальные даты в объединенных таблицах. Тогда число уникальных дат вычитается из семи?

--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
1 голос
/ 05 июня 2009

Не могли бы вы написать свой запрос, чтобы найти отчетливые даты, в которые происходит событие, в течение интересующего вас периода времени?

1 голос
/ 05 июня 2009

Это может быть случай для одной из этих «таблиц значений», где вы создаете таблицу с возможными днями / неделями / чем угодно, а затем присоединяетесь к тем, которые НЕ совпадают и не считают их.

0 голосов
/ 05 июня 2009

При условии, что в вашей таблице Cali_Dates есть строка для каждого дня недели:

Из таблицы Cali_Dates, где находится текущая неделя, найдите все строки с нулевыми значениями (без событий) в таблице Cali_Events.

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:

Редактировать: забыл добавить группу по

0 голосов
/ 05 июня 2009

Переверните запрос и выберите из cali_dates, если в cali_events нет записей для event_id:

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 голосов
/ 05 июня 2009

Я думаю, что это будет работать, но я также думаю, что есть решение, которое использует 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 голосов
/ 05 июня 2009

Итак, у вас есть таблица дат и таблица событий?

Будет ли event_id отображаться в таблице Даты только в случае события?

Если так, не могли бы вы просто ВНУТРЕННЕЕ СОЕДИНЕНИЕ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...