2013-06-22 162 views
0

處理Postgres中的兩個表:成員和成員資格。成員資格有一個end_date列,如果成員資格仍在運行,則該列可以爲NULL。一旦結束,或結束日期已知(可能是未來),該字段將填入日期。根據相關表中沒有返回的記錄查找記錄

現在我想查找所有當前沒有活動成員資格的成員(或者:只有帶有end_dates的成員資格,過去或0個成員資格)。成員顯然可以有1個以上的成員。

我在Rails(3.2)項目中這樣做,並希望能夠在可能的情況下使用ActiveRecord,但如果需要,直接SQL將會執行(儘管我更瞭解ActiveRecord)。

我試圖找到各種各樣的事情與子查詢,但我不能找到一種方法來選擇行,其中在相關表中特定的行數爲0

我一直在谷歌上搜索了很現在有一段時間了,但已經沒有了關於如何搜索的想法。大多數答案都是爲了找到符合標準的記錄,而我覺得我不會那些不符合標準的記錄。也許這是一個新手問題,或者我的目標是錯誤的。在這種情況下:請賜教,我剛剛開始。

基於Jakub的部分回答,我嘗試了更多。目前,我有以下查詢:

SELECT 
    m.id, m.first_name, m.last_name, COUNT (ms.id) AS n_memberships 
FROM 
    members AS m 
LEFT JOIN memberships AS ms 
ON m.id = ms.member_id 
GROUP BY m.id, ms.end_date 
HAVING (max(ms.end_date) < now() AND NOT COUNT(ms.end_date = NULL) > 0) OR COUNT(ms.id) = 0;

這將返回所有成員根本沒有成員(沒有過去也沒有當前)。基於HAVING子句的最後部分(OR ...部分)。 但我期望會員過期成員資格,並且不會返回當前成員資格,因爲max(ms.end_date)將返回一個比現在更少的值,並且沒有給定結束日期將不會有成員資格。這不會發生,任何想法?

回答

1

你在找什麼是OUTER JOIN。在SQL代碼中查找成員沒有成員是:

SELECT m.id 
FROM members AS m 
LEFT JOIN memberships AS s 
    ON m.id=s.member_id 
WHERE s.id IS NULL; 

完整的查詢:

SELECT m.id 
FROM members AS m 
LEFT JOIN memberships AS s 
    ON m.id=s.member_id 
GROUP BY m.id 
HAVING max(s.end_date)<now() OR max(s.end_date) IS NULL 
+0

它越來越相當接近,但尚未完成。如果我省略了「OR ....」部分,我會找到會員資格已經結束的會員,但是如果他們添加了新會員資格,他們仍然會出面,儘管他們再次成爲會員。 – Kobes

+0

應該加上這個:此外,對於當前成員中的任何人,s.end_date IS NULL將爲真,因爲任何正在運行的成員資格都不會有結束日期。我試圖把計數放在某個地方,但我無法讓它工作。如果m.id的成員關係計數爲0,或者m.id的所有s都具有'end_date Kobes

相關問題