2 x lang_id in 2 verschillende tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

David M

David M

15/11/2014 07:56:54
Quote Anchor link
Ik heb de volgende query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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  


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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
WHERE
                    ls.lang_name = 'english'


gaat alles mee met uitzondering van shot-title_subpage....

wie o wie ziet mijn fout.
 
PHP hulp

PHP hulp

21/11/2024 18:10:51
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

15/11/2014 08:41:57
Quote Anchor link
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)
 
David M

David M

15/11/2014 19:14:58
Quote Anchor link
Ik heb deze uitkomst wel nodig zo Ger (;-) )voor een navigatie. De short_title staat in 4 talen in 1 tabel en de short_title_subpackage idem. Mogelijk indeling tabellen niet goed gekozen.

Hoe kan ik de tabellen wat duidelijker tonen in PHP hulp
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

15/11/2014 19:48:48
Quote Anchor link
Het gaat niet zozeer om de opbouw van de tabellen, maar om de manier waarop de query gebouwd is.
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.
 
David M

David M

15/11/2014 20:01:06
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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  
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

15/11/2014 20:34:23
Quote Anchor link
Ga eens nadenken:
je joined een tabel waarmee je niets doet, zo'n beetje als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT a.id FROM a JOIN b on a.id = b.id WHERE a.id=1

Wat ik zou doen is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'
Gewijzigd op 15/11/2014 20:35:34 door Ger van Steenderen
 
David M

David M

15/11/2014 21:50:08
Quote Anchor link
Bedankt voor het goede advies.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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  
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/11/2014 10:46:07
Quote Anchor link
Nogmaals (zucht):
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
INNER JOIN
    languages ls
    ON ls.lang_id IN (cpks.lang_id,cspks.lang_id)

cpks en cspks staan beide in een LEFT JOIN, dus als een package geen cpks én geen cspks heeft dan krijg je:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ON ls.lang_id IN (NULL, NULL)

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.