我正在尝试将几个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
答案 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”或其他任何内容。只需记住预填表,这是一个简单的循环,你必须运行一次。