0

Postgres での 2 つのテーブルの処理: メンバーとメンバーシップ。メンバーシップには、メンバーシップがまだ実行されている場合は NULL になる end_date 列があります。終了するか、終了日が判明すると (将来の可能性があります)、フィールドに日付が入力されます。

ここで、現時点でアクティブなメンバーシップを持たないすべてのメンバーを検索したいと考えています (または、end_dates が設定されていて、過去またはメンバーシップが 0 のメンバーシップのみ)。メンバーは明らかに複数のメンバーシップを持つことができます。

私は Rails (3.2) プロジェクトでこれを行っており、可能であれば ActiveRecord を使用できるようにしたいと考えていますが、必要に応じてストレート SQL で十分です (ただし、ActiveRecord はよく知っています)。

サブクエリであらゆる種類のものを見つけようとしましたが、関連するテーブルの特定の行の数が 0 である行を選択する方法が見つかりません。

私はかなり長い間グーグルで検索してきましたが、検索方法についてのアイデアが不足しています。ほとんどの回答は、基準に一致するレコードを見つけることを扱っており、一致しないレコードは望んでいないと感じています。多分それは初心者の質問か、私が間違ってターゲットにしています。その場合:教えてください、私はちょっと始めたばかりです。

Jakub による部分的な回答に基づいて、さらに多くのことを試しました。現時点では、次のクエリがあります。

選択する
  m.id、m.first_name、m.last_name、COUNT (ms.id) AS n_memberships
から
  メンバー AS m
LEFT JOIN メンバーシップ AS ミリ秒
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) が現在よりも小さい値を返し、特定の終了日のないメンバーシップがないためです。これは起こりませんが、何かアイデアはありますか?

4

1 に答える 1

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
于 2013-06-22T21:31:16.370 に答える