[SQL] Query (left join) geeft niet verwachte resultaat

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb 2 tabellen in mijn database:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
roles:                  users_roles:

+-----+------------+    +-----+-----+
| rid | name       |    | uid | rid |
+-----+------------+    +-----+-----+
| 1   | docent     |    | 43  | 1   |
+-----+------------+    +-----+-----+
| 2   | conrector  |    | 43  | 2   |
+-----+------------+    +-----+-----+
| 3   | congierge  |    | 46  | 1   |
+-----+------------+    +-----+-----+
                        | 47  | 1   |
                        +-----+-----+
                        | 48  | 1   |
                        +-----+-----+

Ik wil het volgende overzicht maken in mijn cms:
SQL:
1
2
3
4
5
6
7
8
9
+-----+------------+--------------+
| rid | name       | aantal users |
+-----+------------+--------------+
| 1   | docent     | 4            |
+-----+------------+--------------+
| 2   | conrector  | 1            |
+-----+------------+--------------+
| 3   | congierge  | 0            |
+-----+------------+--------------+

Hiervoor heb ik de volgende query gemaakt:
SQL:
1
2
3
4
5
SELECT r.rid, r.name, COUNT(ur.uid) AS users
FROM roles r 
  LEFT JOIN users_roles ur ON r.rid = ur.rid 
GROUP BY ur.uid
ORDER BY r.rid

Maar het resultaat hiervan is niet wat ik verwachtte. PHPMyAdmin geeft:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+-----+------------+--------------+
| rid | name       | aantal users |
+-----+------------+--------------+
| 1   | docent     | 1            |
+-----+------------+--------------+
| 2   | conrector  | 1            |
+-----+------------+--------------+
| 2   | docent     | 2            |
+-----+------------+--------------+
| 2   | docent     | 2            |
+-----+------------+--------------+
| 2   | docent     | 1            |
+-----+------------+--------------+
| 2   | docent     | 2            |
+-----+------------+--------------+
| 2   | docent     | 2            |
+-----+------------+--------------+
| 2   | docent     | 1            |
+-----+------------+--------------+
| 2   | docent     | 1            |
+-----+------------+--------------+

// etc...

Wat doe ik verkeerd?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je wil group by r.rid ;)

Maar goed, je hebt een redelijk compleet verhaal in je topicstart, maar wat mist is jouw intentie, de query in woorden. Als je dan opschrijft dat je per role het aantal wil, kom je vanzelf op group by rid. :)

[ Voor 81% gewijzigd door Voutloos op 01-02-2007 21:33 ]

{signature}


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je begrijpt GROUP BY indrdaad niet helemaal goed: klik voor uitleg

Oops! Google Chrome could not find www.rijks%20museum.nl


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Ik heb het gevoel dat je geen LEFT JOIN maar een normale JOIN moet gebruiken.
Verder inderdaad de GROUP BY op een andere kolom (zoals eerder al genoemd).

[ Voor 47% gewijzigd door gvanh op 02-02-2007 13:45 ]


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 01-12 20:47
gvanh schreef op vrijdag 02 februari 2007 @ 13:44:
Ik heb het gevoel dat je geen LEFT JOIN maar een normale JOIN moet gebruiken.
Verder inderdaad de GROUP BY op een andere kolom (zoals eerder al genoemd).
Je gevoel is verkeerd (TS wil ook de rol met 0 users terugzien).

  • lier
  • Registratie: Januari 2004
  • Laatst online: 15:43

lier

MikroTik nerd

Dus:
code:
1
2
3
4
5
SELECT r.rid, r.name, COUNT(ur.uid) AS users
FROM roles r 
  LEFT JOIN users_roles ur ON r.rid = ur.rid 
GROUP BY r.rid, r.name
ORDER BY r.rid

Eerst het probleem, dan de oplossing


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
lier schreef op vrijdag 02 februari 2007 @ 13:56:
Dus:
code:
1
2
3
..
GROUP BY r.rid, r.name
..
Gewoon GROUP BY r.rid dus. Een id is al uniek en de name is 1:1 afhankelijk van dat id, beetje moeilijk doen op niets af.

{signature}


  • lier
  • Registratie: Januari 2004
  • Laatst online: 15:43

lier

MikroTik nerd

Voutloos schreef op vrijdag 02 februari 2007 @ 14:10:
Gewoon GROUP BY r.rid dus. Een id is al uniek en de name is 1:1 afhankelijk van dat id, beetje moeilijk doen op niets af.
Klopt helemaal...ben iets te veel met MsSQL bezig (en daarbij is de r.name verplicht om ook in de GROUP BY op te nemen).

Eerst het probleem, dan de oplossing


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:32

Creepy

Tactical Espionage Splatterer

Voutloos schreef op vrijdag 02 februari 2007 @ 14:10:
[...]

Gewoon GROUP BY r.rid dus. Een id is al uniek en de name is 1:1 afhankelijk van dat id, beetje moeilijk doen op niets af.
Tenzij je geen MySQL gebruikt. In elke andere database ben je verplicht al je niet aggregated fields in je group by op te nemen. In dit geval gaat het goed vanwege de 1:1 afhankelijkheid maar anders plukt MySQL een random waarde van 1 van de rijen er voor je uit..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja, ik had even over name in de select clause heen gekeken, want ik hou zelf ook niet van die mysql 'feature.' :)

{signature}

Pagina: 1