SQL调用以包含多日项目的月份返回计数

时间:2011-10-28 18:12:49

标签: mysql sql

我正在尝试将几个SQL调用压缩成一个,并想知道以下是否可能。

以下是我的表格。

Organization
    id

Event
    id,
    startDate
    endDate

FavoriteOrgs
    userId
    orgId

对于每月的每一天,我想返回当天发生的事件的计数。在您添加事件可以跨越2或3天这一事实之前,不要太困难。

这是我到目前为止所提供的内容,它可以准确地显示每天的事件计数,但它只包括事件发生当天的事件计数。

SELECT DAYOFMONTH( CAST( o.start_date AS DATE ) ) AS dayNum, COUNT( * ) AS count
    FROM favoriteOrgs f, event e, organization o
    WHERE f.user_id =200372
    AND e.profile_id = o.id AND e.profile_id = f.profile_id AND o.id = f.profile_id
    AND e.last_date >=  '$startDate'
    AND e.start_date <=  '$lastDate'
    GROUP BY e.start_date

1 个答案:

答案 0 :(得分:3)

您的数据模型实际上并未对系统中的所有实体建模。一个实体是您有兴趣报告事物的日期。

您应该向数据库添加一个表(或使用临时表,内联表或MySQL提供的任何其他表)。该表仅是所有相关日期。即使是一张可以追溯到1900年并且可以追溯到2100年的表格也相当小。

然后查询变得微不足道了:

CREATE TABLE Calendar (
    calendar_date DATE NOT NULL,
    CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED
)

SELECT
    C.calendar_date,
    COUNT(*) AS count
FROM
    favoriteOrgs F
INNER JOIN Event E ON
    E.profile_id = F.profile_id AND
    E.last_date >= '$startDate' AND
    E.start_date <= '$lastDate'
INNER JOIN Organization O ON
    O.id = F.profile_id AND
    O.id = E.profile_id
WHERE
    F.user_id = 200372
GROUP BY
    C.calendar_date

现在,您还可以在日历日期中添加其他特定于业务的信息,例如“is_holiday”列,“economic_quarter”或其他任何内容。只需记住预填表,这是一个简单的循环,你必须运行一次。