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!