Récupération de données complètes à partir d'une table unique MySQL : couverture des lignes vides et des transactions récentes
Dans cette discussion, nous visons à relever un défi commun rencontré lors de l'interrogation d'une base de données : comment intégrer à la fois les transactions récentes et les jours vides dans les résultats. Plus précisément, nous nous concentrerons sur la récupération des sept derniers jours de transactions de vente tout en incluant les lignes vides pour les jours sans aucune activité.
Pour commencer, nous exploiterons les capacités de la fonction COALESCE(), qui nous permet de substituer une valeur par défaut si l'expression est évaluée à NULL. Dans ce cas, nous utiliserons 0 comme valeur par défaut pour les lignes vides.
Nous créerons ensuite une sous-requête pour générer une liste complète des dates couvrant les sept derniers jours. Cela servira de base à l'ensemble de résultats complet, garantissant que les lignes vides sont incluses.
Enfin, nous effectuerons une opération LEFT JOIN entre la liste de dates générée et la table des transactions, en faisant correspondre les enregistrements en fonction du PURCHASE_DATE. colonne. Cela fusionnera les transactions avec les enregistrements de dates vides, nous permettant de calculer le montant total des ventes pour chaque jour et d'afficher à la fois les transactions récentes et les lignes vides.
La requête résultante fournira effectivement un aperçu complet des sept dernières jours de transactions de vente, comptant les jours sans activité enregistrée.
Voici la requête complète pour référence :
SELECT t1.purchase_date, COALESCE(SUM(t1.amount + t2.amount), 0) AS amount FROM ( SELECT DATE_FORMAT(a.Date,'%Y-%m-%d') AS purchase_date, '0' AS amount FROM ( SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c ) a WHERE a.Date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() ) t1 LEFT JOIN ( SELECT DATE_FORMAT(purchase_date, '%Y-%m-%d') AS purchase_date, COALESCE(SUM(amount), 0) AS amount FROM transactions WHERE purchase_date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() GROUP BY purchase_date ) t2 ON t2.purchase_date = t1.purchase_date GROUP BY t1.purchase_date ORDER BY t1.purchase_date DESC;
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!