Select uit meerdere tabellen.
Ik ben een factureersysteem aan het maken.
Dit zou als volgt moeten werken.
Voor een klant wordt een order gemaakt.
Hierin staan 1 of meerdere artikelen.
Als dit wordt uitgeleverd wordt, wordt er een pakbon gemaakt.
Van deze pakbonnen kan dan een factuur worden gemaakt.
Heb ik van 1 klant meerdere pakbonnen dan zou ik deze op 1 factuur willen hebben.
Op zich heb ik dit principe onder controle.
Echter, om te factureren wil een lijst hebben van pakbonnen per klant, welke nog niet zijn gefactureerd. Ik krijg alleen de lijst er niet fatsoenlijk uit.
Dit is mijn query:
Code (php)
1
2
3
4
2
3
4
$pakbon_result = mysql_query("SELECT pakbonnen.pakbon_ID, pakbonnen.order_ID, pakbonnen.pakbon_nummer, orders.order_nummer
FROM pakbonnen, orders, pakbon_per_factuur, klanten
WHERE pakbonnen.pakbon_ID!=pakbon_per_factuur.pakbon_ID AND pakbonnen.order_ID=orders.order_ID AND orders.klant_ID=klanten.klant_ID AND klanten.klant_ID=$k_ID
ORDER BY orders.order_nummer ASC");
FROM pakbonnen, orders, pakbon_per_factuur, klanten
WHERE pakbonnen.pakbon_ID!=pakbon_per_factuur.pakbon_ID AND pakbonnen.order_ID=orders.order_ID AND orders.klant_ID=klanten.klant_ID AND klanten.klant_ID=$k_ID
ORDER BY orders.order_nummer ASC");
Dit werkt wel alleen wanneer ik meerdere rijen in mijn pakbon_per_factuur
tabel heb, geeft ie dezelfde pakbonnen meerdere keren weer.
Mijn query zal wel niet goed zijn, maar ik zie hem ff niet.
Iemand een idee?
Groeten Johan
Toevoeging op 27/06/2012 19:13:57:
Dit zijn trouwens mijn tabellen:
Pakbonnen
- pakbon_ID
- order_ID
- pakbon_nummer
Orders
- order_ID
- order_nummer
- klant_ID
Pakbon_per_factuur
- ppf_ID
- factuur_ID
- pakbon_ID
Klanten
- klant_ID
- klant_naam
Ik heb bij orders en klanten wat velden weggelaten die niet van belang zijn.
Iemand een idee?
Groeten Johan
hier zoek je voor elke pakbon_ID alle rijen van pakbon_per_factuur waar het niet gelijk is aan de pakbon_ID daar.
Stel je hebt 1,2,3,4 in pakbonnen en in pakbon_per_factuur als pakbon_ID dan returned hij:
1 -> 2,3,4
2 -> 1,3,4
3 -> 1,2,4
4 -> 1,2,3
Je maakt nu gebruik van een impliciete INNER JOIN door meerdere tabellen te noemen na FROM.
Wat jij wilt is gewoon een lijst met pakbonnen IDs en dan kijken welke nog niet gefactureerd zijn -- dus nog niet voorkomen in pakbon_per_factuur.
Gebruik een OUTER JOIN .. met als ON pakbonnen.pakbon_ID = pakbon_per_factuur.pakbon_ID .. en dan WHERE pakbon_per_factuur.pakbon_ID = NULL
Dan match hij alleen de pakbon IDs die bij elkaar horen en zoekt hij alle pakbon IDs die geen match hebben.
Je kan je query verder uitbreiden om extra informatie er nog bij te doen (meer JOINS)
Het is geen = NULL maar IS NULL
Ger van Steenderen op 21/08/2012 09:53:18:
In MySQL bestaat geen OUTER JOIN zonder LEFT of RIGHT ervoor.
Het is geen = NULL maar IS NULL
Het is geen = NULL maar IS NULL
Ik dacht dat dit bij de meeste databases zelfs zo is? Bij postgresql bijvoorbeeld. Je mag vaak wel het woordje 'OUTER' weglaten. 'INNER' moet je dan uiteraard wel schrijven.
Het gebruik van INNER is ook optioneel, net zoals inderdaad OUTER. Dat is standaard SQL dus van toepassing op bijna elke database.