[OPGELOST] Meerdere Joins in Query
Het gaat om de tabellen: modules, blocks, active_modules, active_blocks, rights, user_rights
Ik heb nu deze Query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
b.module_id,
r.description,
COUNT(u.right_id)
FROM
active_blocks AS a
LEFT JOIN
blocks AS b
ON
b.id=a.block_id
LEFT JOIN
modules AS m
ON
m.id=b.module_id
LEFT JOIN
user_rights AS u
ON
u.user_id=?
LEFT JOIN
rights AS r
ON
r.id=u.right_id
WHERE
a.company_id=?
b.module_id,
r.description,
COUNT(u.right_id)
FROM
active_blocks AS a
LEFT JOIN
blocks AS b
ON
b.id=a.block_id
LEFT JOIN
modules AS m
ON
m.id=b.module_id
LEFT JOIN
user_rights AS u
ON
u.user_id=?
LEFT JOIN
rights AS r
ON
r.id=u.right_id
WHERE
a.company_id=?
Wat ik nu wil is:
Alle rechten per module en block te weergeven, en waarvan die gebruiker al rechten heeft, dat het vinkje aangevinkt moet zijn.
Ik wil nu alle rechten in een array zetten, deze haal ik dan op in een andere while-loop die de actieve modules weergeeft (die werkt).
Nu moet het er zo uit komen te zien:
ADMIN (module)
-----------------------
- BEDRIJVEN - (block)
Bedrijven bekijken
Bedrijven bewerken
bedrijven verwijderen
etc.....
De indeling van mijn tabellen zien er zo uit:
modules:
id | name | description | sort
active_modules:
id | company_id | module_id
blocks:
id | module_id | name | title | description
active_blocks:
id | company_id | block_id
rights:
id | right | description
user_rights:
id | user_id | right_id
Ik hoop dat het zo duidelijk is en dat jullie mij hiermee kunnen helpen.
Edit:
Ik heb hem:
Ik heb hem:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT
m.id,
r.description,
(SELECT
COUNT(*)
FROM
user_rights AS u
WHERE
u.right_id=r.id
AND
u.user_id=?)
FROM
modules AS m
LEFT JOIN
blocks AS b
ON
b.module_id=m.id
LEFT JOIN
active_blocks AS a
ON
a.block_id=b.id
AND
a.company_id=?
LEFT JOIN
rights AS r
ON
r.module_id=m.id
AND
r.block_id=b.id
WHERE
r.block_id!=''
m.id,
r.description,
(SELECT
COUNT(*)
FROM
user_rights AS u
WHERE
u.right_id=r.id
AND
u.user_id=?)
FROM
modules AS m
LEFT JOIN
blocks AS b
ON
b.module_id=m.id
LEFT JOIN
active_blocks AS a
ON
a.block_id=b.id
AND
a.company_id=?
LEFT JOIN
rights AS r
ON
r.module_id=m.id
AND
r.block_id=b.id
WHERE
r.block_id!=''
Gewijzigd op 31/05/2013 11:51:23 door Nick Dijkstra
Een subquery in SELECT vreet aan de performance, zet die gewoon in een join, dus:
Code (php)
1
2
3
4
5
2
3
4
5
LEFT JOIN
(SELECT user_id, COUNT(*) rights_amount
FROM user_rights
WHERE user_id = ?) ur
USING (user_id)
(SELECT user_id, COUNT(*) rights_amount
FROM user_rights
WHERE user_id = ?) ur
USING (user_id)
Gewijzigd op 31/05/2013 16:34:59 door Ger van Steenderen