2017-02-01 34 views
0

我正在尝试为以下情况创建查询,但我似乎无法从概念到实际。本月和上个月出勤的SQL子查询

我有三个表:

  • 档案(ID,名字,姓氏)
  • 事件(ID,日期)
  • 出席(PROFILE_ID,EVENT_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] 

所以,第一个问题是我是否不正确我思考的问题和我在一个良好的方向发展。第二个问题是如何正确执行这些子查询 - 我可以很容易地制作类似SELECT * FROM Attendance WHERE MONTH(Date) = 12 AND YEAR(Date) = 2016的东西,但是这将返回所有出席者的列表。我真正想要的是仅列出每个ID的参加人数 - 所以当我查看ID 4时,我想查看该特定ID是否在本月和上个月有出席,但我不是确定如何将其添加到WHERE子句中。

+0

1)是 - 这是一个方法。另一个是计算不同月份的总数等于参数的数量。对于2),请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple -sql-query – Strawberry

回答

1

首先,避免在列名中使用关键字,就像您所做的一样日期Event(ID,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)

这将给那些谁在参加一个配置文件列表不同的月份。所以接下来的事情是从那个集合中选择只出现两次的人。与GROUP BY x.id HAVING COUNT(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 
+0

关于关键字的使用,你是对的 - 我实际上将它改为“Date”作为匿名形式,实际名称就像dateOfClass或类似的东西。关于这个问题,这不包括本月两次来过,但是上个月零次的人吗?您可能会在最后一句话中提到,但我不清楚它 – Jake

+0

刚刚看到了编辑 - 非常感谢! – Jake