Maison > base de données > tutoriel mysql > Comment trouver correctement les joueurs d'une équipe dans une plage d'années spécifique dans PostgreSQL ?

Comment trouver correctement les joueurs d'une équipe dans une plage d'années spécifique dans PostgreSQL ?

Mary-Kate Olsen
Libérer: 2025-01-02 22:31:39
original
632 Les gens l'ont consulté

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

Recherche de plages de dates qui se chevauchent dans PostgreSQL

Vous avez fourni une requête qui tente de trouver tous les joueurs qui faisaient partie d'une équipe spécifique dans une année donnée, mais cela ne fonctionne pas correctement. Résolvons les problèmes auxquels vous êtes confrontés et proposons une solution alternative pour rechercher des plages de dates qui se chevauchent.

Problèmes avec la requête d'origine :

  • La requête n'utilise pas correctement l'opérateur BETWEEN pour inclure l'année limite supérieure, alors que la plupart des cas l'excluent.
  • La requête ne vérifie pas si les joueurs n'ont jamais quitté le équipe, qui devrait également être incluse.

Requête correcte :

Pour trouver tous les joueurs d'une équipe donnée qui ont rejoint avant 2010 et ne sont pas partis avant 2009, vous pouvez utiliser la requête suivante :

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';
Copier après la connexion

Supplémentaire Considérations :

  • Si votre table d'équipe est utilisée uniquement pour la jointure et n'ajoute aucune information nécessaire, vous pouvez simplifier la requête en la supprimant.
  • Pour gérer joueurs qui n'ont peut-être jamais quitté l'équipe (représentés par NULL dans date_leave), vous pouvez utiliser un OU clause :
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)
Copier après la connexion

Utilisation de l'opérateur OVERLAPS :

PostgreSQL fournit également l'opérateur OVERLAPS, qui peut être utilisé pour rechercher des plages qui se chevauchent. La requête suivante utilise OVERLAPS pour rechercher les joueurs qui chevauchaient la plage « 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');
Copier après la connexion

Utilisation d'un type de plage :

Dans PostgreSQL 9.2 ou version ultérieure, vous pouvez utiliser un type de plage pour représenter des plages de dates. Cela offre de meilleures performances et permet une prise en charge plus facile des index.

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
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal