Heim >Datenbank >MySQL-Tutorial >Wie finde ich in PostgreSQL korrekt Spieler in einem Team innerhalb eines bestimmten Jahresbereichs?

Wie finde ich in PostgreSQL korrekt Spieler in einem Team innerhalb eines bestimmten Jahresbereichs?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-02 22:31:39638Durchsuche

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

Überlappende Datumsbereiche in PostgreSQL finden

Sie haben eine Abfrage bereitgestellt, die versucht, alle Spieler zu finden, die in einem bestimmten Team waren angegebenes Jahr, aber es funktioniert nicht richtig. Lassen Sie uns die Probleme angehen, mit denen Sie konfrontiert sind, und eine alternative Lösung zum Auffinden überlappender Datumsbereiche bereitstellen.

Probleme mit der ursprünglichen Abfrage:

  • Die Abfrage wird falsch verwendet Der BETWEEN-Operator schließt das Jahr der Obergrenze ein, während es in den meisten Fällen ausgeschlossen wird.
  • Die Abfrage prüft nicht, ob die Spieler das Team nie verlassen haben. was ebenfalls enthalten sein sollte.

Richtige Abfrage:

Um alle Spieler eines bestimmten Teams zu finden, die vor 2010 beigetreten sind und nicht vor 2009 gegangen sind, Sie können die folgende Abfrage verwenden:

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';

Zusätzlich Überlegungen:

  • Wenn Ihre Teamtabelle nur für den Join verwendet wird und keine notwendigen Informationen hinzufügt, können Sie die Abfrage vereinfachen, indem Sie sie entfernen.
  • Zur Handhabung Spieler, die das Team möglicherweise nie verlassen haben (dargestellt als NULL in date_leave), können Sie ein ODER verwenden Klausel:
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)

Verwendung des OVERLAPS-Operators:

PostgreSQL bietet auch den OVERLAPS-Operator, der zum Auffinden überlappender Bereiche verwendet werden kann. Die folgende Abfrage verwendet OVERLAPS, um Spieler zu finden, die sich mit dem Bereich „01.01.2009“, „01.01.2010“ überschneiden:

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

Verwenden eines Bereichstyps:

In PostgreSQL 9.2 oder höher können Sie einen Bereichstyp verwenden, um Datumsbereiche darzustellen. Dies sorgt für eine bessere Leistung und ermöglicht eine einfachere Indexunterstützung.

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

Das obige ist der detaillierte Inhalt vonWie finde ich in PostgreSQL korrekt Spieler in einem Team innerhalb eines bestimmten Jahresbereichs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn