mySQL Left Join sur plusieurs tables avec des conditions
J'ai un problème. J'ai 4 tables:
Invoice_Payment, Facture, Client, et le Calendrier
En gros, j'ai le dessous de la requête, qui fonctionne bien, à l'exception, des mois sans date_due ne reviennent pas. I. E mois seulement avec un date_due sera retourné.
Remarque: le calendrier de table tout simplement des listes de tous les jours de l'année. Il contient un seul col appel date_field
Base de données: http://oberto.co.nz/jInvoice.txt
Résultat attendu: ma requête actuelle, ci-dessous, sera de retour quelque chose comme:
month total
August 5
September 0
October 196
November 205
December 214
January 229
Avis combien de septembre n'est pas retourné? C'est parce que le tableau Invoice_Payment n'a pas de date_due enregistrement
Je pense que je dois utiliser une jointure gauche et rejoindre le calendrier de table avec quelque chose comme:
LEFT JOIN Calendrier SUR Invoice_Payments.date_paid = Calendrier.date_field. Mais je vais avoir pas de chance
SELECT MONTHNAME(Invoice_Payments.date_paid) as month, SUM(Invoice_Payments.paid_amount) AS total
FROM Invoice, Client, Invoice_Payments
WHERE Client.registered_id = 1
AND Client.id = Invoice.client_id
And Invoice.id = Invoice_Payments.invoice_id
AND date_paid IS NOT NULL
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid)
Toute aide appréciée.
- date_due est dans la table de facture ou invoice_payment table??
- Je ne vois pas de n'importe où dans la requête de filtrage
date_due
. vous êtes sûr que c'est pas le retour de ces lignes? - Pourquoi serait - gauche rejoindre la
calendar
tableau de l'aide? - date_due est dans le invoice_payment table
- J'ai pensé à gauche rejoindre le calendrier de table pour montrer tous les mois, même ceux sans une date de paiement
Vous devez vous connecter pour publier un commentaire.
Il semble que vous essayez de trouver des valeurs pour toutes les dates à l'intérieur d'une plage, indépendamment de savoir si il existe une valeur ou pas. En supposant que nous avons un Calendrier de table structuré comme suit:
Votre requête pourrait ressembler à de la sorte (où X et Y représentent le début et date de fin de la plage dans laquelle vous étudiez):
Techniquement, la requête ci-dessus devrait faire l'affaire. Cependant, une autre alternative est l'utilisation d'un dérivé de la table sur laquelle vous m'avez demandé dans les commentaires:
registered_id=1
critères dans la clause where et uniquement Jan de données qui a de la valeur. 3. Votre calendrier de table ne comprend Jan et pas toutes les dates à travers la plage que vous souhaitez.J'ai couru dans un problème similaire et résolus en déplaçant le non calendrier de tableau des conditions de la clause where et dans la jointure. Voir mon explication complète ici: https://gist.github.com/1137089
Dans votre cas, vous aurez besoin de prendre le from table1, table2, tableau3 dans table1 left join sur x=y, etc...
Je voudrais définir explicitement tous vos jointures pour des raisons de lisibilité.
Un exemple simple d'une jointure externe la préservation de toutes les lignes de la première table, remplir toutes les colonnes manquantes dans le deuxième tableau avec les valeurs null:
En supposant que le Calendrier de table est l'un provoque la perte de données, voici un coup à votre requête:
Bonne chance!