2017-02-01 63 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