Mysql SQL调用以返回包含多天项目的每月天数计数

Mysql SQL调用以返回包含多天项目的每月天数计数,mysql,sql,Mysql,Sql,我正试图将几个SQL调用压缩为一个,并想知道是否可以执行以下操作 这是我的桌子 Organization id Event id, startDate endDate FavoriteOrgs userId orgId 对于每月的每一天,我想返回当天发生的事件的计数。不太难,除非您添加事件可以跨越2或3天的事实 这是我到目前为止所得到的,它准确地显示了每天的事件计数,但它只包括开始当天的事件计数 SELECT DAYOFMONTH( CAST

我正试图将几个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
选择DAYOFMONTH(强制转换(o.start\u date为date))作为dayNum,COUNT(*)作为COUNT
来自favoriteOrgs f、事件e、组织o
其中f.user_id=200372
和e.profile_id=o.id和e.profile_id=f.profile_id和o.id=f.profile_id
和e.last_date>=“$startDate”

并且e.start_date您的数据模型实际上并没有对系统中的所有实体进行建模。一个实体是您对报告事项感兴趣的日期

您应该向数据库中添加一个表(或者使用临时表、内联表或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
创建表格日历(
日历日期不为空,
约束PK_日历主键群集
)
挑选
C.日历日期,
计数(*)作为计数
从…起
偏爱组织
上的内部联接事件E
E.profile_id=F.profile_id和
E.last_date>=“$startDate”和

你能发布你的方案吗?在问题中发布了,但这里又是:组织(id);事件(id、开始日期、结束日期);favoriteOrgs(userId,orgId)不是架构。我不知道那是什么。在您的mysql客户端中运行'DESC organization',等等。请参阅。ID是整数。startDate和endDate是时间戳。非常好的回应,谢谢。请原谅我在这里的经验不足,但目前“opportunity”表的“startDate”和“endDate”列都是时间戳,因为opportunity有开始和结束时间以及日期。有没有一种方法可以利用这个带有时间戳的解决方案?如果你只想在白天把它分解,那么我认为代码没有什么不同。不过,我是一个MS SQL用户,他们的时间戳数据类型很糟糕,所以我不确定MySQL是如何处理的。如果你想把它按小时或别的什么分类,那么你可以把它加入一组生成的从1到24的数字中,并根据这些数字和日期进行存储。关键是将您的bucket集本身看作一个数据集。