没有行时如何计算?

时间:2009-06-05 19:05:56

标签: sql mysql

我正在尝试计算当前周没有与之相关的事件的天数,但我不知道该怎么做。

例如,我使用此查询计算本周发生的事件数:

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 个答案:

答案 0 :(得分:10)

此查询使用子查询查找已连接表中的所有唯一日期。然后从七个中减去唯一日期的数量?

--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 :(得分:1)

这可能是其中一个“价值表”的情况,您可以在其中创建一个表格,其中包含可能的天数/周/等等,然后加入那些不匹配的表格。算上他们。

答案 2 :(得分:1)

难道你不能写信查询在你感兴趣的时间范围内找到有事件的不同日期吗?

答案 3 :(得分: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包含一周中每一天的记录。

答案 4 :(得分:0)

如果cali_events中没有记录event_id的记录,则翻转查询并从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())

答案 5 :(得分:0)

假设您的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的答案:

编辑:忘了按

添加群组

答案 6 :(得分:-1)

所以你有一个Dates表和一个Events表吗?

如果有事件,event_id只会显示在Dates表中吗?

如果是这样,你不能只进行一次内联活动吗?