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)
我正试图获得一份本月和上个月都参加过的个人资料列表

到目前为止,我已经考虑过对这两个月进行某种计数,并且只在它们大于1时才选择它们,但我还没有完全让它起作用

比如:

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或类似的名称。关于这个问题,这不包括本月来过两次但上个月来过零次的人吗?你可以在最后一句话中谈到这一点,但我不清楚