Calcul des différences entre les lignes dans une instruction MySQL SELECT
Dans ce scénario, vous disposez d'une table MySQL contenant des données telles que des kilomètres, des dates, et des informations sur la voiture, mais elles ne sont pas toujours classées par ordre chronologique. Votre objectif est de créer une vue qui inclut une colonne supplémentaire affichant le nombre de kilomètres depuis la dernière date pour chaque voiture.
Pour y parvenir, vous ne pouvez pas vous appuyer sur un simple JOIN sur la colonne ID car les données sont pas triés par ordre chronologique. Au lieu de cela, vous devez utiliser un LEFT JOIN et une sous-requête pour déterminer la date maximale qui précède la date actuelle pour chaque ligne.
Utilisation d'un LEFT JOIN et d'une sous-requête
La requête suivante utilise un LEFT JOIN pour connecter la ligne actuelle du tableau (mt1) avec une ligne (mt2) dont la date maximale est antérieure à la date de mt1 :
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
Cette requête calcule la différence entre les kilomètres de la ligne actuelle (mt1) et les kilomètres de la ligne avec la date maximale antérieure à la date actuelle (mt2). Si mt2 est NULL, cela signifie qu'il n'y a pas de ligne précédente, donc la différence est 0.
Méthode alternative utilisant MySQL Hackery
Comme alternative, vous pouvez utiliser un MySQL hack pour émuler la fonction lag(), qui n'est pas supportée nativement dans MySQL :
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
Cette requête utilise une variable définie par l'utilisateur (@kilo) pour garder une trace de la valeur du kilomètre précédent. La différence entre la valeur kilométrique actuelle et @kilo vous donne le nombre de kilomètres depuis la dernière date. La variable @kilo est mise à jour avec la valeur kilométrique actuelle après le traitement de chaque ligne.
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!