[MySQL] LEFT JOIN icm COUNT

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 01-10 16:55
Oke, deze SQL noob kan zich prima redden met de meest basic queries maar Google en Stackoverflow kunnen mij niet redden met de volgende query (die ook basic is maar bij mij doet ie t niet :o )

Ik heb 2 tabellen:

Tabel "users"
IdUser
Naam

Tabel "notities"
UserId
Notitie

Ik wil alle users uit de tabel "users" ophalen en vervolgens tonen hoeveel notities ze hebben gemaakt. Een user kan dus 10 notities hebben maar een user kan ook 0 (geen) notities hebben.

Ik gebruik nu de volgende query, die zou volgens alle stackoverflowtjes en 'het internet :+ ' goed moeten zijn. Echter krijg ik alleen maar de resultaten terug als er ook notities zijn. De users zonder notities worden dus niet getoond??

code:
1
2
3
4
SELECT *, COUNT(users.IdUser) AS Aantal 
FROM users 
LEFT JOIN notities ON users.IdUser = notities.UserId
GROUP BY users.IdUser


Wat doe ik hierin verkeerd? De volgorde van de tabel is volgens mij goed (links users, en een LEFT JOIN op de tabel notities) en ik group by op de 1e tabel. Toch doe ik iets foutief |:(

Beste antwoord (via WoBBeL op 04-04-2021 15:46)


  • _reboot_
  • Registratie: December 2004
  • Laatst online: 17-09 22:35
Als je de query aanpast naar:

COUNT(notities.userId) AS Aantal

heb je denk ik wat je zoekt.

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • _reboot_
  • Registratie: December 2004
  • Laatst online: 17-09 22:35
Als je de query aanpast naar:

COUNT(notities.userId) AS Aantal

heb je denk ik wat je zoekt.

Acties:
  • +1 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 02:47

g0tanks

Moderator CSA
Als een user 0 notities heeft, komt zijn ID dan voor in de tabel notities? Zonee dan kunnen ze ook niet 'gejoined' worden en krijg je van die IDs geen resultaten. Je moet een join doen waarbij je alle IDs van de tabel users meeneemt, ook als ze niet voorkomen in de tabel notities.

[ Voor 26% gewijzigd door g0tanks op 04-04-2021 15:47 ]

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 01-10 16:55
Wow...het is zondag...bedankt!
g0tanks schreef op zondag 4 april 2021 @ 15:46:
Als een user 0 notities heeft, komt zijn ID dan voor in de tabel notities? Zonee dan kunnen ze ook niet 'gejoined' worden en krijg je van die IDs geen resultaten.
Zo logisch 8)7

[ Voor 83% gewijzigd door WoBBeL op 04-04-2021 15:47 ]


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
g0tanks schreef op zondag 4 april 2021 @ 15:46:
Als een user 0 notities heeft, komt zijn ID dan voor in de tabel notities? Zonee dan kunnen ze ook niet 'gejoined' worden en krijg je van die IDs geen resultaten. Je moet een join doen waarbij je alle IDs van de tabel users meeneemt, ook als ze niet voorkomen in de tabel notities.
Hij doet toch gewoon een left join? Of ben ik nou simpel?

Verder: Hoe werkt dat GROUP BY nu eigenlijk?
MySQL slikt 't maar je hoort op alle non-aggregates (dus alles wat niet in een count/sum/avg/etc. staat) in je GROUP BY op te nemen.

[ Voor 19% gewijzigd door RobIII op 04-04-2021 15:58 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • _reboot_
  • Registratie: December 2004
  • Laatst online: 17-09 22:35
RobIII schreef op zondag 4 april 2021 @ 15:56:
[...]
Hij doet toch gewoon een left join? Of ben ik nou simpel?
Hij deed inderdaad alles goed behalve het gebruikte veld in de COUNT(). Een COUNT(notities.userId) telt geen regels die NULL als waarde bevat. Een COUNT(*) telt alle regels.

Als je een query wilt debuggen haal je eerst even het resultaat op zonder hier nog bewerkingen op te doen.

code:
1
2
3
SELECT *
FROM users 
LEFT JOIN notities ON users.IdUser = notities.UserId

Hier zie je alle users uitkomen en daaraan gekoppeld wel of geen notities. Bij geen notities zijn alle velden uit de notities tabel NULL. Wanneer je meerdere notities van een user hebt, zul je de user meerdere keren zien voorkomen.

Nu wil je vervolgens GROUPEN op iedere unieke user (users.userId), maar alle notities tellen (notities.userId), dus hierbij dient opgelet te worden welk veld je gebruikt in de COUNT().

Offtopic: Wil je alleen users mét notities tellen, dan dien je een INNER JOIN te gebruiken.
RobIII schreef op zondag 4 april 2021 @ 15:56:
Verder: Hoe werkt dat GROUP BY nu eigenlijk?
MySQL slikt 't maar je hoort op alle non-aggregates (dus alles wat niet in een count/sum/avg/etc. staat) in je GROUP BY op te nemen.
Dit klopt ook. Echter MySQL accepteert dit alleen wanneer je hem op "niet-strict mode" instelt. Zet je hem in strict mode dan dient ieder veld waarop gegrouped wordt ook in de SELECT voor te komen. Dit geldt dan echter niet voor de velden die gebruikt worden in SUM(), COUNT(), GROUP_CONCAT(), etc.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
_reboot_ schreef op zondag 4 april 2021 @ 16:26:
[...]


Hij deed inderdaad alles goed behalve het gebruikte veld in de COUNT(). Een COUNT(notities.userId) telt geen regels die NULL als waarde bevat. Een COUNT(*) telt alle regels.
I know, ik reageerde dan ook op g0tanks ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 01-10 16:55
Rustaaagh :P

En nog een tip: doe de juiste WHERE ook achter de ON anders ben je weer 15 minuten bezig :+
Pagina: 1