login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[SQL] Joins (Opgelost)

Offline finduilas - 19/11/2014 13:22 (laatste wijziging 16/08/2015 14:56)
Avatar van finduilasPHP gevorderde Hallo

Ik heb een tabel met producten (dranken) en een tabel met bestellingen (bestellingen).

Nu wens ik uit de tabel producten alles te selecteren, en daarbij een som van de bestellingen van dit product.

Dit lukt:
  1. $this->db->SELECT('dranken.id,dranken.naam,dranken.minimum_prijs,dranken.gewicht, SUM(bestellingen.aantal) AS totaalVerkocht');
  2. $this->db->FROM('dranken');
  3. $this->db->group_by('dranken.id');
  4. $this->db->JOIN('bestellingen', 'bestellingen.drank_id = dranken.id',"left");


Nu wil ik ook dat ik de enkel de bestellingen meetel voor een bepaalde datum.

  1. $this->db->WHERE('bestellingen.date <=',$whereDate);


Dit geeft echter enkel de producten weer die een bestelling hebben in deze periode. Dus als er nog geen bestellingen zijn worden deze niet opgenomen.

Daarom dacht ik om een extra WHERE aan toe te voegen.
  1. $this->db->OR_WHERE('bestellingen.date',NULL);


Dit zorgt er voor dat alle producten worden weergeven die ook nog geen bestellingen hebben.

Echter bots ik nu op een probleem. Als er een product is met een bestelling die valt na de periode die ik wens is valt deze uit de resultaten. Hij voldoet namelijk niet aan WHERE statement. Logisch ook, maar dan zou ik eigenlijk liever NULL zien.

Ik dacht dat een LEFT JOIN ervoor zorgde dat alles uit de eerste tabel (hier dranken) zeker in het resultaat zat.

Hoe kan ik dit oplossen?

2 antwoorden

Gesponsorde links
Offline Thomas - 19/11/2014 14:51 (laatste wijziging 19/11/2014 14:52)
Avatar van Thomas Moderator Door deze conditie op te nemen in de JOIN conditie in plaats van de WHERE conditie (althans, dat zou moeten werken geloof ik). Kan dat in deze abstractielaag?

Misschien is het ook handig om er ff bij te vertellen welke abstractielaag je gebruikt (en ik ben benieuwd waarom?).
Offline finduilas - 19/11/2014 15:04 (laatste wijziging 19/11/2014 15:07)
Avatar van finduilas PHP gevorderde Als je met Abstractielaag bedoeld het framework, dit is CODEIGNITOR ;).

Na nog wat doorgezocht te hebben zou het inderdaad mogelijk zijn om de WHERE in de JOIN op te nemen. Even uittesten.

EDIT: Dat was dus de oplossing..

  1. $this->db->SELECT('dranken.id,dranken.naam,dranken.minimum_prijs,dranken.gewicht,SUM(bestellingen.aantal) AS totaalVerkocht');
  2. $this->db->FROM('dranken');
  3. $this->db->group_by('dranken.id');
  4. $this->db->JOIN('bestellingen', 'bestellingen.drank_id = dranken.id AND bestellingen.date <= "'.$whereDate.'"','left');
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.2s