Maison >base de données >tutoriel mysql >Comment récupérer efficacement le dernier état de chaque service à l'aide des jointures SQL ?

Comment récupérer efficacement le dernier état de chaque service à l'aide des jointures SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-04 10:37:35833parcourir

How to Efficiently Retrieve the Latest Status for Each Service Using SQL Joins?

Joindre des tables et limiter les résultats en SQL

En SQL, nous avons souvent besoin de récupérer des données de plusieurs tables. Une façon d'y parvenir consiste à utiliser une jointure interne, qui combine les enregistrements de deux tables en fonction de champs communs. De plus, nous devrons peut-être limiter les résultats à un nombre spécifique d'enregistrements.

Défi :

Considérons le scénario suivant : nous avons deux tables, Service et Statut. . La table Service contient les noms et les ID des services, tandis que la table Status contient les statuts et l'ID du service auquel ils appartiennent. Nous souhaitons récupérer le dernier statut de chaque service.

Solution initiale :

Une tentative pour résoudre ce problème consiste à utiliser l'instruction SQL suivante :

SELECT ser.id, ser.name, a.status, a.timestamp
from Service ser
  inner join (select * from status
              order by Status.timestamp
              DESC limit 1) as a
    on a.service_id = ser.id

Cependant, cette déclaration ne récupère que le dernier statut d'un service, pas de tous.

Optimisé Solution :

Pour obtenir les résultats corrects, nous pouvons utiliser une requête imbriquée pour trouver l'horodatage maximum pour chaque service. Cette sous-requête est ensuite utilisée dans une jointure interne pour sélectionner les enregistrements souhaités :

SELECT 
  ser.id, 
  ser.name, 
  s.status, 
  s.timestamp 
FROM Service ser 
INNER JOIN status as s ON s.service_id = ser.id
INNER JOIN
(
   SELECT
     service_id, 
     MAX(timestamp) AS MaxDate
   FROM status 
   GROUP BY service_id
) AS a  ON a.service_id = s.service_id 
       AND a.MaxDate = s.timestamp;

Explication :

La sous-requête crée une nouvelle table en sélectionnant l'horodatage maximum pour chaque ID de service. Cette table est ensuite utilisée dans une jointure interne avec les tables d'origine pour récupérer les enregistrements avec les derniers horodatages.

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!

Déclaration:
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