Mysql 本月和上月考勤的SQL子查询
我正试图为以下情况创建一个查询,但我似乎无法从概念到实际得到它 我有三张桌子:Mysql 本月和上月考勤的SQL子查询,mysql,sql,Mysql,Sql,我正试图为以下情况创建一个查询,但我似乎无法从概念到实际得到它 我有三张桌子: 配置文件(ID、名、姓) 事件(ID、日期) 出席人数(个人资料ID、活动ID) 我正试图获得一份本月和上个月都参加过的个人资料列表 到目前为止,我已经考虑过对这两个月进行某种计数,并且只在它们大于1时才选择它们,但我还没有完全让它起作用 比如: SELECT * FROM Profile LEFT OUTER JOIN Attendance ON Profile.ID = Attendance.Profile_
- 配置文件(ID、名、姓)
- 事件(ID、日期)
- 出席人数(个人资料ID、活动ID)
SELECT * FROM Profile
LEFT OUTER JOIN Attendance ON Profile.ID = Attendance.Profile_ID
LEFT OUTER JOIN Event ON Attendance.Event_ID = Event.ID
WHERE [subquery to confirm attendance of this Profile_ID in this month/year > 1]
AND [subquery to confirm attendance of this Profile_ID in last month/year > 1]
所以第一个问题是我是否正确地思考了这个问题,并且朝着一个好的方向前进。第二个问题是如何正确地执行这些子查询-我可以很容易地从考勤中选择*,其中月(日期)=12和年(日期)=2016,但这将返回所有考勤的列表。我真正想要的是每个ID的出席人数列表——因此,当我查看ID 4时,我想查看该特定ID是否在本月和上个月出席,但我不确定如何将其添加到WHERE子句中。首先避免在列名中使用关键字,就像在Date
事件(ID,Date)中一样
回答你的第一个问题:这样想是合乎逻辑的,而且是有可能做到的。关于方向,我认为左连接方法是可以的,所以主要的问题是过滤器。
现在,由于该月的第二次出席无关紧要,我们仅从事件日期中提取月份,以便获得重复的extract(month from Events.event\u date
)记录。现在DATEDIFF()
不合适,因此我们使用month()
来获取当前和上一个月的事件。
MONTH(CURRENT_DATE)-MONTH(Events.event_DATE)=0
给出当月的事件
MONTH(CURRENT_DATE)-MONTH(Events.event_DATE)=1
给出上月的事件
MONTH(CURRENT_DATE)-MONTH(Events.event_DATE)=-11
如果当前月份为一月(即1-12=-11),则给出十二月的事件
这将为在不同月份参加会议的人员提供一个个人资料列表。因此,下一步是从该集合中选择只出现两次的人员。使用按x.id分组,计数(x.id)=2
所以你应该
SELECT x.id,x.first_name,x.last_name FROM (
SELECT DISTINCT Profile.ID,Profile.first_name,Profile.last_name,Attendance.Profile_ID, EXTRACT(MONTH FROM Events.event_date) AS event_date FROM
Profiles
LEFT OUTER JOIN Attendance ON Profile.ID = Attendance.Profile_ID
LEFT OUTER JOIN Events ON Attendance.Event_ID = Events.ID
WHERE (
(MONTH(CURRENT_DATE) - MONTH(Events.event_date)) = 0
OR
(MONTH(CURRENT_DATE) - MONTH(Events.event_date)) = 1
OR
(MONTH(CURRENT_DATE) - MONTH(Events.event_date)) = -11
)
) AS x GROUP BY x.id HAVING COUNT(x.id) = 2
1) 是的,这是一种方法。另一种方法是计算总数等于参数数的不同月份。对于2),请参阅关于关键字的使用,你是对的-我实际上将其改为“日期”,作为一种匿名形式,实际名称类似于dateOfClass或类似的名称。关于这个问题,这不包括本月来过两次但上个月来过零次的人吗?你可以在最后一句话中谈到这一点,但我不清楚