ホームページ >データベース >mysql チュートリアル >PostgreSQL で特定の年の範囲内のチームのプレーヤーを正しく検索するにはどうすればよいですか?

PostgreSQL で特定の年の範囲内のチームのプレーヤーを正しく検索するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-02 22:31:39632ブラウズ

How to Correctly Find Players on a Team Within a Specific Year Range in PostgreSQL?

PostgreSQL での重複する日付範囲の検索

特定のチームに所属していたすべてのプレーヤーを検索するクエリを提供しました。指定された年ですが、正しく動作しません。直面している問題に対処し、重複する日付範囲を検索するための代替解決策を提供しましょう。

元のクエリの問題:

  • クエリは誤って使用していますBETWEEN 演算子には上限の年が含まれますが、ほとんどの場合はそれが除外されます。
  • クエリは次のことをチェックしません。プレーヤーはチームを離れたことがないので、これも含める必要があります。

正しいクエリ:

2010 年より前に加入した特定のチームのすべてのプレーヤーを検索します。 2009 年より前に出発していない場合は、次を使用できますクエリ:

SELECT DISTINCT p.*
FROM team AS t
JOIN contract AS c ON t.name_team = c.name_team
JOIN player AS p ON c.name_player = p.name_player
WHERE t.name_team = ?
AND c.date_join < '2010-01-01'
AND c.date_leave >= '2009-01-01';

追加の考慮事項:

  • チーム テーブルが結合のみに使用され、必要な情報を追加しない場合は、次のことができます。クエリを削除してクエリを簡素化します。
  • チームを離れたことがない可能性のあるプレーヤーを処理するため ( date_leave)、OR 句を使用できます:
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)

OVERLAPS 演算子の使用:

PostgreSQL には、使用できる OVERLAPS 演算子も用意されています。重複する範囲を検索します。次のクエリは、OVERLAPS を使用して、範囲 '2009-01-01'、'2010-01-01' と重複するプレーヤーを検索します:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS
      ('2009-01-01', '2010-01-01');

Using a Range Type:

PostgreSQL 9.2 以降では、範囲タイプを使用して日付範囲を表すことができます。これにより、パフォーマンスが向上し、インデックスのサポートが容易になります。

CREATE TYPE date_range AS RANGE (date, date);

CREATE INDEX mv_stock_dr_idx ON mv_stock USING gist (daterange(date_join, date_leave));

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND daterange(date_join, date_leave) &&&
      daterange('[2009-01-01,2010-01-01)'); -- upper bound excluded

以上がPostgreSQL で特定の年の範囲内のチームのプレーヤーを正しく検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。