Ik heb de volgende query:

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:


WHERE
                    ls.lang_name = 'english'


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)
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
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.

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  


Ga eens nadenken:
je joined een tabel waarmee je niets doet, zo'n beetje als:

SELECT a.id FROM a JOIN b on a.id = b.id WHERE a.id=1

Wat ik zou doen is:

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'
Bedankt voor het goede advies.


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   
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.

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:

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


Reageren