Maison  >  Article  >  base de données  >  Comment calculer la différence de lignes d'une instruction MySQL SELECT ?

Comment calculer la différence de lignes d'une instruction MySQL SELECT ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-10 10:05:02322parcourir

How do you calculate the difference in rows of a MySQL SELECT statement?

Calcul de la différence entre les lignes d'une instruction SELECT MySQL

Dans MySQL, le calcul de la différence entre les lignes d'une instruction SELECT peut être effectué via diverses méthodes. Une approche courante consiste à utiliser une auto-jointure, vous permettant de comparer les lignes d'un même tableau. Considérez le scénario suivant :

Énoncé du problème :

Vous disposez d'un tableau contenant des données sur les véhicules, notamment leurs kilomètres, leur date, l'identification de la voiture et le conducteur. Cependant, en raison des différentes séquences de saisie des données, les données peuvent ne pas être triées. Votre objectif est de créer une vue qui affiche le nombre de kilomètres parcourus depuis la dernière entrée pour chaque combinaison voiture-conducteur, ce qui donne le format suivant :

ID | Kilometers | date       | car_id | car_driver | number_km_since_last_date   
 1 | 100        | 2012-05-04 | 1 | 1 | 0  
 2 | 200        | 2012-05-08 | 1 | 1 | 100  
 4 | 600        | 2012-05-16 | 1 | 1 | 400  
 3 | 1000       | 2012-05-25 | 1 | 1 | 400

Solution 1 : Rejoindre avec sous-requête

Vous pouvez utiliser une sous-requête dans un INNER JOIN pour récupérer les kilomètres de la ligne précédente pour chaque record :

SELECT
    mt1.ID,
    mt1.Kilometers,
    mt1.date,
    mt1.Kilometers - IFNULL(mt2.Kilometers, 0) AS number_km_since_last_date   
FROM
    myTable mt1
    LEFT JOIN myTable mt2
        ON mt2.Date = (
            SELECT MAX(Date)
            FROM myTable mt3
            WHERE mt3.Date < mt1.Date
        )
ORDER BY mt1.date

Dans cette requête, une sous-requête sélectionne la date maximale avant la date de la ligne actuelle, et cette date maximale est ensuite mise en correspondance avec un enregistrement dans LEFT JOIN.

Solution 2 : émuler la fonction Lag

MySQL n'offre pas de fonction lag() intégrée, mais vous pouvez imiter son comportement via une variable définie par l'utilisateur :

SET @kilo=0;

SELECT
    mt1.ID,
    mt1.Kilometers - @kilo AS number_km_since_last_date,
    @kilo := mt1.Kilometers Kilometers,
    mt1.date
FROM myTable mt1
ORDER BY mt1.date

Dans cette requête, la variable définie par l'utilisateur @kilo stocke les kilomètres de la ligne précédente. À chaque itération, la variable définie par l'utilisateur est mise à jour, suivant efficacement l'évolution des kilomètres.

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