2016-02-19 121 views
3

每個ID統計最後條目我有一個非週期性藝術課程。 我每天都添加新的「禮物」進入到一個表。SQL如何基於一個標準

我想知道什麼是錯過了最後2天的學生。就在最後2天。

重要的是,每個學生選擇一個不同的工作日來上課。其中一些人每週2天。

我有2個表,學生派駐

禮物是3列的表格:student_id數據,日,本。

我會得到一個查詢強調指出,錯過了最後2天所有的學生。

這將返回一個表3列:student_id數據,名稱,如果錯過這兩個最後一天,我怎樣才能得到這樣的結果?

表strucure是

  • 學生 ID:INT,名稱:VARCHAR

  • 存在 student_id數據:INT,日:日期,目前:布爾

一個數據示例

presences         students 
student_id day   present   id name 
---------------------------------   ------------ 
1   2016-01-01 0     1 'Bob' 
1   2016-01-10 1     2 'Carol' 
1   2016-01-20 0 

2   2016-01-15 1 
2   2016-01-27 0 
2   2016-01-21 0 

在這種情況下,鮑勃錯過剛剛過去的一天,卡羅爾錯過最後2天。預期的結果是:

student_id name misses_two_last_days 
---------------------------------------- 
1   Bob  FALSE 
2   Carol TRUE 
+0

如果您添加表結構以及虛擬數據和預期結果,將會有所幫助。不知道你如何得到這個查詢,但它看起來很尷尬。 – davejal

+0

首先,davejal是正確的,你應該使用表結構,否則我們不會知道你是如何得到這個錯誤的。其次,你是否只嘗試了子查詢部分?還有一個錯誤? –

+0

「最後2天」是什麼?每個學生都一樣嗎?或者你是否試圖檢查學生最後2天是否在那裏?略有不同,但會導致截然不同的答案... – sgeddes

回答

1

很多與您的查詢的問題。嘗試重寫它以使用joins。您還必須定義最近2天。我試圖用下面的subquery來做到這一點。然後,您需要使用aggregation來查看學生是否錯過了兩天。這裏的東西,應該是接近:

select s.id, s.name 
from students s 
    inner join presences p on s.id = p.student_id and p.present = false 
    inner join (select distinct day 
       from presences 
       order by day desc 
       limit 2) t on p.day = t.day 
group by s.id, s.name 
having count(p.day) = 2 

重讀你的問題,如果你想返回所有的學生,而不僅僅是那些已經錯過了最後2天,你需要使用outer joins代替並取出having子句並替換爲case聲明:

select s.id, s.name, 
    case when count(p.day) = 2 then 'missed' else '' end as Missed 
from students s 
    left join presences p on s.id = p.student_id and p.present = false 
    left join (select distinct day 
       from presences 
       order by day desc 
       limit 2) t on p.day = t.day 
group by s.id, s.name 
+0

似乎「不計數(p.day)= 2」部分是不需要的。有什麼特別的理由讓它增加? –

-1

您必須定義您在查詢中使用的表的別名。

例如:

SELECT s.id, s.name, p.day FROM 
Students s, Presences p 
WHERE s.id = p.student_id 
+0

這應該是一個評論,而不是aswer – Matt

+1

我可以理解,我會盡量不在未來重複同樣的錯誤。 –

0

另一個解決方案包含一個子程序。請檢查它是否符合您的要求。

SELECT 
    s.id, 
    s.name, 
    (SELECT SUM(p.present = false) 
     FROM p 
     WHERE p.student_id = s.id 
     ORDER BY p.day DESC 
     LIMIT 2) AS misses_two_last_days 
FROM s; 
0

現在,因爲你給的信息太少,我可以告訴你的是什麼地方錯了你的子查詢:,重命名錶作爲子查詢,但你

SELECT COUNT(*) FROM 
(SELECT p.student_id 
     FROM p WHERE p.student_id = s.id ORDER BY p.day DESC LIMIT 2) AS subquery 
WHERE p.present = false 

讓我們檢查這個哪裏仍在使用p.present這就是爲什麼你會得到錯誤。數據庫不能得到什麼是p。並且您的查詢有點悲慘,如果您可以清楚地描述它,我會盡力幫助您實現它的工作