處理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)將返回一個比現在更少的值,並且沒有給定結束日期將不會有成員資格。這不會發生,任何想法?
它越來越相當接近,但尚未完成。如果我省略了「OR ....」部分,我會找到會員資格已經結束的會員,但是如果他們添加了新會員資格,他們仍然會出面,儘管他們再次成爲會員。 – Kobes
應該加上這個:此外,對於當前成員中的任何人,s.end_date IS NULL將爲真,因爲任何正在運行的成員資格都不會有結束日期。我試圖把計數放在某個地方,但我無法讓它工作。如果m.id的成員關係計數爲0,或者m.id的所有s都具有'end_date
Kobes