2 x lang_id in 2 verschillende tabellen
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
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
SELECT
pk.package_id,
pk.slug,
cpks.short_title,
spk.subpackage_id,
spk.slug_subpackage,
cspks.short_title_subpackage
FROM
packages pk
LEFT JOIN
subpackages spk
ON spk.package_id = pk.package_id
LEFT JOIN
content_packages cpks
ON cpks.package_id = pk.package_id
LEFT JOIN
content_subpackages cspks
ON cspks.subpackage_id = spk.subpackage_id
INNER JOIN
languages ls
ON ls.lang_id IN (cpks.lang_id,cspks.lang_id)
WHERE
ls.lang_name = 'dutch'
AND pk.display = 1
GROUP BY
pk.package_id,spk.subpackage_id
ORDER BY
pk.package_id asc
pk.package_id,
pk.slug,
cpks.short_title,
spk.subpackage_id,
spk.slug_subpackage,
cspks.short_title_subpackage
FROM
packages pk
LEFT JOIN
subpackages spk
ON spk.package_id = pk.package_id
LEFT JOIN
content_packages cpks
ON cpks.package_id = pk.package_id
LEFT JOIN
content_subpackages cspks
ON cspks.subpackage_id = spk.subpackage_id
INNER JOIN
languages ls
ON ls.lang_id IN (cpks.lang_id,cspks.lang_id)
WHERE
ls.lang_name = 'dutch'
AND pk.display = 1
GROUP BY
pk.package_id,spk.subpackage_id
ORDER BY
pk.package_id asc
waarbij dit het resultaat is:
package_id slug short_title subpackage_id slug_subpackage short_title_subpackage
4 vergaderarrangementen Vergaderen 1 4-uurs-arrangement 4-uur
4 vergaderarrangementen Vergaderen 2 8-uurs-arrangement 8-uur
4 vergaderarrangementen Vergaderen 3 12-uurs-arrangement 12-uur
4 vergaderarrangementen Vergaderen 4 24-uurs-arrangement 24-uur
5 overnachtings-arrangementen Overnachten NULL NULL NULL
6 restaurant-arrangementen Wine & Dine NULL NULL NULL
als ik nu taal verander in:
gaat alles mee met uitzondering van shot-title_subpage....
wie o wie ziet mijn fout.
Je hebt een inner join met voorwaarden op kolommen van tabellen uit een left join, hierdoor worden alle left joins inner joins (de vergelijking NULL = iets resulteert niet in TRUE)
Hoe kan ik de tabellen wat duidelijker tonen in PHP hulp
Je gebruikt de namelijk de taal tabel niet eens in de kolom lijst (select clause)
Ook kan je beter de taal tabel meerdere malen joinen in plaats van (de onjuist toegepaste) group by.
Een veel gemaakte fout is om te filteren op waarden uit een tabel die in een left join staat, je moet die voorwaarden meenemen in de join voorwaarde niet in de where clause.
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
32
33
34
35
36
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
32
33
34
35
36
SELECT
pk.package_id,
pk.slug,
cpks.short_title,
spk.subpackage_id,
spk.slug_subpackage,
cspks.short_title_subpackage
FROM
packages pk
LEFT JOIN
content_packages cpks
ON cpks.package_id = pk.package_id
JOIN
languages ls
ON ls.lang_id =cpks.lang_id
AND
ls.lang_name = 'english'
JOIN
subpackages spk
ON spk.package_id = pk.package_id
LEFT JOIN
content_subpackages cspks
ON cspks.subpackage_id = spk.subpackage_id
JOIN
languages ls2
ON ls2.lang_id =cspks.lang_id
AND
ls2.lang_name = 'english'
-- AND pk.display = 1
-- GROUP BY
-- pk.package_id,spk.subpackage_id
ORDER BY
pk.package_id asc
pk.package_id,
pk.slug,
cpks.short_title,
spk.subpackage_id,
spk.slug_subpackage,
cspks.short_title_subpackage
FROM
packages pk
LEFT JOIN
content_packages cpks
ON cpks.package_id = pk.package_id
JOIN
languages ls
ON ls.lang_id =cpks.lang_id
AND
ls.lang_name = 'english'
JOIN
subpackages spk
ON spk.package_id = pk.package_id
LEFT JOIN
content_subpackages cspks
ON cspks.subpackage_id = spk.subpackage_id
JOIN
languages ls2
ON ls2.lang_id =cspks.lang_id
AND
ls2.lang_name = 'english'
-- AND pk.display = 1
-- GROUP BY
-- pk.package_id,spk.subpackage_id
ORDER BY
pk.package_id asc
je joined een tabel waarmee je niets doet, zo'n beetje als:
Wat ik zou doen is:
Code (php)
1
2
3
4
2
3
4
SELECT COALECSE (s.id, 'ga een ander vak leren') say
FROM users u
LEFT JOIN skill s USING (user_id)
WHERE u. user_name = 'David M'
FROM users u
LEFT JOIN skill s USING (user_id)
WHERE u. user_name = 'David M'
Gewijzigd op 15/11/2014 20:35:34 door Ger van Steenderen
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
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
SELECT
pk.package_id,
pk.slug,
cpks.short_title,
spk.subpackage_id,
spk.slug_subpackage,
cspks.short_title_subpackage
FROM
packages pk
JOIN
content_packages cpks
ON cpks.package_id = pk.package_id
JOIN
languages ls
ON ls.lang_id =cpks.lang_id
AND ls.lang_name = 'dutch'
LEFT JOIN
subpackages spk
ON spk.package_id = pk.package_id
LEFT JOIN
content_subpackages cspks
ON cspks.subpackage_id = spk.subpackage_id
AND ls.lang_id =cspks.lang_id
ORDER BY
pk.package_id asc,spk.subpackage_id asc
pk.package_id,
pk.slug,
cpks.short_title,
spk.subpackage_id,
spk.slug_subpackage,
cspks.short_title_subpackage
FROM
packages pk
JOIN
content_packages cpks
ON cpks.package_id = pk.package_id
JOIN
languages ls
ON ls.lang_id =cpks.lang_id
AND ls.lang_name = 'dutch'
LEFT JOIN
subpackages spk
ON spk.package_id = pk.package_id
LEFT JOIN
content_subpackages cspks
ON cspks.subpackage_id = spk.subpackage_id
AND ls.lang_id =cspks.lang_id
ORDER BY
pk.package_id asc,spk.subpackage_id asc
Ger:
Je gebruikt de namelijk de taal tabel niet eens in de kolom lijst (select clause)
Op die manier wordt het lastig te bepalen wat de bedoeling is.
cpks en cspks staan beide in een LEFT JOIN, dus als een package geen cpks én geen cspks heeft dan krijg je:
Met andere woorden, er wordt niet aan de join voorwaarden voldaan.
Als echter in beide tabellen een match gevonden wordt met de taal tabel krijg je dubbele records.
Dus je moet de taaltabel joinen voor elke vertaling die je wilt, niet met de smoezelige workaround GROUP BY
En voor in de select moet je een kijken naar coalesce