Toon posts:

[SQL] probleem met LEFT JOIN

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi, ik probeer gegevens op te halen uit een hoofdtabel en door middel van LEFT JOIN's deze gegevens te verrijken (hoeveel klanten, hoeveel producten, hoeveel gebruikers). De volgende SQL query heb ik daarvoor opgesteld:

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT company.naam, company.ID, COUNT(users.ID) as number, COUNT(product.ID) as number_product, COUNT(customers.ID) as number_customer
FROM company
LEFT JOIN users
ON company.ID =users.company
LEFT JOIN product
ON company.ID = product.company_ID
LEFT JOIN customers
ON company.ID = customers.company_ID
GROUP BY company.ID
ORDER BY naam ASC


Het probleem zit hem in de laatste leftjoin, ik heb het vermoeden dat omdat de kolommen van customers en product dezelfde naam hebben het volgende gebeurt:

ipv het volgende rijtje:

naam-------number_product--------number_customer
klant1---------------2--------------------------------1---------
klant2---------------3--------------------------------5----------

gaat hij al vooraf deze twee bij elkaar tellen (??) en krijg ik dus:

naam-------number_product--------number_customer
klant1---------------3--------------------------------3---------
klant2---------------8--------------------------------8----------

Ik begrijp echter niet wat MySQL doet besluiten dit te gaan optellen, aangezien netjes de tabel verwijzing erbij staat, en in de select ze allemaal via AS een unieke naam krijgen!

Heb al op de site van mysql gekeken en op w3schools.com echter zonder resultaat.

iemand? thx!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Count werkt op je resultset, de counts worden niet verdeeld over de verschillende tabellen zoals jij verwacht. Het doen van meerdere counts in 1 query is dan ook niet zinvol. Wel worden nullvalues niet meegerekend, in elk geval bij Oracle.

doe maar eens het volgende en bestudeer je resultset:
SQL:
1
2
3
4
5
6
7
8
9
SELECT company.naam, company.ID, users.ID as number, product.ID as number_product, customers.ID as number_customer
FROM company
LEFT JOIN users
ON company.ID =users.company
LEFT JOIN product
ON company.ID = product.company_ID
LEFT JOIN customers
ON company.ID = customers.company_ID
ORDER BY company.ID


Kijk anders een hier:
http://www.techonthenet.com/sql/count.php
Het gaat weliswaar om Oracle, maar het beschrijft COUNT vrij precies.

[ Voor 4% gewijzigd door bigbeng op 19-04-2007 08:48 ]


Verwijderd

Topicstarter
Het rare is echter dat COUNT(users.ID) as number (wat blijkbaar een gereserveerd woord is gezien de kleur) en COUNT(product.ID) as... wel een verschillend (gewenst) resultaat geven! Het toevoegen van de derde levert echter problemen op!

Is hier overigens wel een andere oplossing voor, ik probeerde eindelijk eens wat meer te doen met query's namelijk.

edit: Okee, na het zien van jouw query begrijp ik het probleem!! Het is dus puur toeval geweest dat het bij COUNT(Users) wel goed is gegaan... zou het toevoegen van een distinct nog wat uithalen??

SOLUTION:

COUNT(DISTINCT users.ID)

thx bigbeng voor de goede link!

[ Voor 27% gewijzigd door Verwijderd op 19-04-2007 08:58 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Je group by is trouwens ook niet juist
klik

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op donderdag 19 april 2007 @ 09:00:
Je group by is trouwens ook niet juist
klik
Erg onbegrepen inderdaad dat Group By :P

Uit de tekst begrijp ik dat ik:
Maar let op de hoofdregel: zodra je een GROUP BY-clause gebruikt, moeten alle geselecteerde kolommen terugkomen in de GROUP BY list oftewel een aggregate functie hebben.
Indien oftewel eigenlijk ofwel moet zijn... begrijp ik dat ik alle losse selects dus moet opnemen in de GROUP BY clause. Correct?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Alle velden die in je select opgenomen zijn, en geen sum, avg, count, etc.... zijn, moeten in je group by voorkomen.
In jouw geval is dat dus company.naam en company.id

https://fgheysels.github.io/


Verwijderd

Topicstarter
Okee, dan zou ik voorstellen de FAQ tekst aan te passen:

"oftewel" heeft volgens mij namelijk een andere, minder beschrijvende betekenis dan "ofwel"

Kan ik dit ergens aangeven??

Bedankt voor je hulp zover whoami! Ik ben nog niet zo heel erg thuis in SQL, maar aangezien ik de kracht goed kan gebruiken, leuk om te leren!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Wat is het vershil dan volgens jou tussen 'ofwel' en 'oftewel' ? Of, anders gezegd, waarom zou 'oftewel' minder duidelijk zijn ?

https://fgheysels.github.io/


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
"ofwel" betekent in deze context: "of op een andere manier"
"oftewel" betekent in deze context: "met andere woorden" / "dus"

dus Bo-oz heeft m.i. gelijk dat het "ofwel" moet zijn...

edit: met behulp van Van Dale:

of·wel (vw.)
1 [form.] of [in tegenstellend zinsverband, bij twee mogelijkheden]


of·te·wel (vw.)
1 [form.] het voorafgaande verklarend of nader toelichtend

[ Voor 57% gewijzigd door P.O. Box op 19-04-2007 09:39 ]


Verwijderd

Topicstarter
thx Edward voor het toelichten mbv concreet bewijs :)

I rest my case :P

Maar ehh.. even voor mijn informatie.. directe PM aan de auteur of is hier ergens een topic voor?

edit: Al aangepast zie ik!

[ Voor 7% gewijzigd door Verwijderd op 19-04-2007 23:35 ]

Pagina: 1