本月和上个月出席的SQL子查询

时间:2017-02-01 07:32:30

标签: mysql sql

我正在尝试针对以下情况制作查询,但我似乎无法将其从概念变为实际。

我有三张桌子:

  • 个人资料(ID,First_Name,Last_Name)
  • 活动(ID,日期)
  • 出勤(Profile_ID,Event_ID)

我正在尝试获取本月和上个月都参加过的个人资料列表。

到目前为止,我已经想过要在两个月内做一些计数,并且只在它们大于1时选择它们,但我还没有完全使用它。

类似的东西:

public class Program
{
   List<Dog> dogList = new List<Dog>();  
}

所以第一个问题是我是否正确地思考问题并且朝着一个好的方向前进。第二个问题是如何正确地执行这些子查询 - 我可以轻松地创建类似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] 的内容,但这将返回所有出席的列表。我真正想要的是仅列出每个ID的出席情况 - 所以当我查看ID 4时,我想查看该特定ID是否在本月和上个月有出席,但我不是确定如何将其添加到WHERE子句。

1 个答案:

答案 0 :(得分:1)

使用日期Event(ID,Date)时,首先使用关键字在列名称中避免使用关键词 回答你的第一个问题:以这种方式思考并且有可能得到它是合乎逻辑的。关于方向,我认为左连接方法是正确的,因此主要问题是在过滤器上。 现在,由于本月第二次出席并不重要,我们只提取活动日期的月份,以便我们获得重复EXTRACT(MONTH FROM Events.event_date的记录。现在DATEDIFF()不合适,所以我们使用MONTH()来获取当前和上个月的事件。     MONTH(CURRENT_DATE) - MONTH(Events.event_date) = 0在当月举办活动     MONTH(CURRENT_DATE) - MONTH(Events.event_date) = 1在上个月举办了活动     如果当前月份是1月(即1-12 = -11),则MONTH(CURRENT_DATE) - MONTH(Events.event_date) = -11会在12月发生事件

这将列出在不同月份就读的人员的个人资料列表。接下来的事情就是从那个集合中选择那些出现两次的人。使用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