Toon posts:

MySQL probleem join query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb voor (een urensysteem) de volgende 3 tabellen:

tProjecten
id (pri. key, auto inc.)
klantid
projectnaam
projectnummer
maxuren
memo
archief

tUren
id (pri. key, auto inc.)
projectid
werkzaamheidid
werknemerid
aantal (uren)
min
datum
werkzaamheden

tKlanten
id (pri. key, auto inc.)
bedrijfsnaam
contactpersoon
vAdres
vPostcode
vPlaats
vLand
pAdres
pPostcode
pPlaats
pLand
telefoon1
telefoon2
kvk
btw
bank
memo
email
website
archief

Nu wil uit deze 3 tabellen alle gegevens van een project selecteren met daarbij de bedrijfsnaam van de klant die erbij hoort (tKlanten.bedrijfsnaam), en de tijd die er aan dat project gewerkt is (sum(tUren.aantal) en sum(tUren.min)).

Om dit voor elkaar te krijgen, heb ik devolgende query bedacht:

code:
1
2
3
4
5
6
7
8
9
SELECT 
  tProjecten.*, 
  tKlanten.bedrijfsnaam, 
  sum(tUren.aantal) uur, 
  sum(tUren.min) min 
FROM 
  tProjecten 
LEFT JOIN tKlanten ON tProjecten.klantid=tKlanten.id 
LEFT JOIN tUren ON tUren.projectid=tProjecten.id group by tUren.projectid;


Dit werkt goed, maar nu loop ik vast op iets wat volgens mij heel simpel zou moeten zijn :?

Ik wil namelijk ook 1 bepaald project kunnen selecteren. Terwijl deze query ALLE projecten uit de database leest. Ik wil dus gewoon een toevoeging als "where tProjecten.id=X". Ik weet alleen niet hoe ik dit voor elkaar moet krijgen.

Wanneer ik achter de Query bijvoorbeeld "and tProjecten.id=1" toevoeg. Dat krijg ik wel data uit de query, maar dat is NIET het juiste record :?

Mischiend dat iemand anders hier even naar zou kunnen kijken. Dit lijkt me heel simpel, maar ik kom er niet uit |:(

  • smaij
  • Registratie: November 2000
  • Nu online
SELECT
tProjecten.*,
tKlanten.bedrijfsnaam,
sum(tUren.aantal) uur,
sum(tUren.min) min
FROM
tProjecten
LEFT JOIN tKlanten ON tProjecten.klantid=tKlanten.id
LEFT JOIN tUren ON tUren.projectid=tProjecten.id
WHERE id = 1
GROUP BY id;
hoe bedoel je dat dit niet werkt?

[ Voor 0% gewijzigd door smaij op 18-10-2002 13:12 . Reden: overzichtelijker maken ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-08 19:34
Doe eens:
code:
1
2
GROUP BY ....
HAVING projecten.id = 1

ipv die WHERE.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Fuck ik zit met mijn where helemaal op de verkeerde plaats te kloten. Pff ik zit ook al zo lang naar die query te kijken. Net een artikel over joins gelezen, en dit is de eerste query die ik daarmee in elkaar sleutel.

Nu werkt hij eindelijk :)


Dat having werkt trouwens ook, maar wel heel traag. Met een "where" heeft hij 0.02 sec nodig om de data op te vragen, en met having 2.41sec. Dit is dezelfde tijd als hij nodig heeft om heel de tabel op te vragen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
whoami schreef op 18 oktober 2002 @ 13:14:
Doe eens:
code:
1
2
GROUP BY ....
HAVING projecten.id = 1

ipv die WHERE.
Grr, grr:
Dat is misbruik maken van de HAVING.
Je moet eerst filteren, vervolgens groeperen en uiteindelijk middels je HAVING aangeven, dat de groep aan bepaalde voorwaarden moet voldoen.
Achter HAVING komt dus iets met COUNT, AVG, SUM, MAX of MIN.

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Nu online
cameodski schreef op 18 oktober 2002 @ 13:21:
[...]

Grr, grr:
Dat is misbruik maken van de HAVING.
Je moet eerst filteren, vervolgens groeperen en uiteindelijk middels je HAVING aangeven, dat de groep aan bepaalde voorwaarden moet voldoen.
Achter HAVING komt dus iets met COUNT, AVG, SUM, MAX of MIN.
hehe kalm :D het probleem is toch opgelost :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-08 19:34
cameodski schreef op 18 oktober 2002 @ 13:21:
[...]

Grr, grr:
Dat is misbruik maken van de HAVING.
Je moet eerst filteren, vervolgens groeperen en uiteindelijk middels je HAVING aangeven, dat de groep aan bepaalde voorwaarden moet voldoen.
Achter HAVING komt dus iets met COUNT, AVG, SUM, MAX of MIN.


Ja, je hebt wel gelijk. Vandaar ook dat het met die having veel trager is. Het DBMS gaat eerst voor alle id's de berekeningen doen, en dan pas het record met id gaan selecteren, terwijl je met een where enkel de berekening doet voor het record met id 1.
Ik vond het ook wel vreemd dat die WHERE niet werkte (wat hij normaal gezien wel zou moeten doen), vandaar dat ik eens voorstelde om het met having te proberen. Om eens te kijken wat er dan gebeurd.

sorry for my lameness. :+

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
:) :)
Wel interessant om een keertje te horen hoe traag het wel niet is.

Never underestimate the power of


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
smaij schreef op 18 oktober 2002 @ 13:23:
hehe kalm :D het probleem is toch opgelost :P
Ik ben niet boos, maar ik vind het toch wel een beetje smerig om het zo op te lossen.

Never underestimate the power of


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-08 19:34
cameodski schreef op 18 oktober 2002 @ 13:40:
[...]

:) :)
Wel interessant om een keertje te horen hoe traag het wel niet is.


Traag is het wel, maar ik vraag me af of het niet te optimizen is. Misschien moet de TS maar eens het execution plan van z'n query bekijken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Pff er gaat nog steeds iets mis. Wanneer ik onderstaande Query uitvoer, dan mis ik een aantal records (ik krijg maar 88 results terwijl de tabel projecten 100 records bevat).

Zo mis ik bijvoorbeeld het record met het id: 61. Het vreemde is dat wanneer ik dat record opvraag met de 2e onderstaande query, ik hem WEL gewoon te zien krijg. Terwijl die query nagenoeg hetzelfde is :?

Iemand een idee wat er mis gaat? Want ik snap er niks van :(

Query1
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
  tProjecten.id proj_id, 
  tProjecten.projectnaam, 
  tProjecten.projectnummer, 
  tProjecten.maxuren, 
  tKlanten.bedrijfsnaam, 
  sum(tUren.aantal) uur, 
  sum(tUren.min) min 
FROM 
  tProjecten 
LEFT JOIN tKlanten ON tProjecten.klantid=tKlanten.id 
LEFT JOIN tUren ON tUren.projectid=tProjecten.id 
GROUP BY 
  tUren.projectid 
ORDER BY 
  tKlanten.bedrijfsnaam;


Query2
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
  tProjecten.id proj_id, 
  tProjecten.projectnaam, 
  tProjecten.projectnummer, 
  tProjecten.maxuren, 
  tKlanten.bedrijfsnaam, 
  sum(tUren.aantal) uur, 
  sum(tUren.min) min 
FROM 
  tProjecten 
LEFT JOIN tKlanten ON tProjecten.klantid=tKlanten.id 
LEFT JOIN tUren ON tUren.projectid=tProjecten.id 
WHERE 
  tProjecten.id=61 
GROUP BY 
  tUren.projectid

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik denk dat voor project 61 nog geen uren aanwezig zijn. Daardoor groepeer je op NULL en dat geeft rare effecten.
Je kunt beter groeperen op tProjecten.id ipv op tUren.projectid

Never underestimate the power of


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-08 19:34
Ik vind het zowiezo raar dat die query werkt.
Normaal gezien moeten alle columns in die in uw select-list staan een geen aggregated columns zijn, in de group by clause komen.

In uw geval is dat dus:
code:
1
GROUP BY proj_id, projectnaam, projectnummer, maxuren, bedrijfsnaam


't Zal wel aan MySQL liggen zeker dat hij dat pakt?

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Soms zou ik wel eens willen dat MSSQL ook iets meer pikte. Als ik bijvoorbeeld een GROUP BY doe op de primary key in de projecten tabel, zou het best handig zijn als ik de rest van de velden uit de projecten tabel niet meer in de GROUP BY hoef op te nemen. Het verandert toch helemaal niets aan het uiteindelijke resultaat.

Never underestimate the power of


Verwijderd

Topicstarter
Thanx cameodski en whoami een fout in de GROUP BY dus. Dat was idd het probleem :)


Ik blijf het alleen vreemd vinden dat die 2e query (met dezelfde GROUP BY) wel werkt.

Maar goed, het probleem is dus opgelost :)
Pagina: 1