SELECT
p.product_id,
GROUP_CONCAT( DISTINCT CONCAT( optlan.option_label,',',ovl.value) SEPARATOR ';') AS options_01,
CONCAT(GROUP_CONCAT(DISTINCT optlan.option_label),';', GROUP_CONCAT(DISTINCT ovl.value)) AS options_02,
CONCAT_WS(';', optlan.option_label, GROUP_CONCAT(DISTINCT ovl.value) ) AS options_03
FROM
products p
JOIN category c
ON p.category_id = c.category_id
LEFT JOIN
options_categories opcat
ON opcat.category_id = c.category_id
LEFT JOIN
options opt
ON opt.option_id = opcat.option_id
LEFT JOIN
options_lang optlan
ON optlan.option_id = opt.option_id AND optlan.lang_id = 'NL'
LEFT JOIN
option_values ov
ON ov.option_id = opt.option_id
LEFT JOIN
option_values_lang ovl
ON ovl.value_id = ov.value_id AND ovl.lang_id = 'NL'
WHERE p.product_id = '25'
GROUP BY p.product_id
options_01 geeft:
optie a,40;optie a,50;optie b,60;optie b,70
options_2 geeft:
optie a,optie b;40,50,60,70
en options_03:
optie b;60,70
Hetgeen ik zou willen is dit, maar ja.....
optie a;40,50|optie b;60,70
Met wat als uiteindelijk doel? Dat je, afhankelijk van dropdown X een andere dropdown Y krijgt waarbij de waarden afhankelijk zijn van de gekozen waarde van X?
Misschien is het makkelijker om de tweede (zijn er nog meer? of is dit altijd maar 1 niveau diep?) dropdown op afroep te vullen, bijvoorbeeld via AJAX. Wanneer je een waarde selecteert in dropdown X stuur je een GET of POST request naar je applicatie met de geselecteerde waarde. Deze retourneert vervolgens JSON-data waarmee je via JavaScript een tweede (of volgende) dropdown genereert.
Dit is onderdeel van een PIM. Er moeten opties aan een product worden toegevoegd om in de webshop wel of niet getoond te worden.
Ik heb de oplossing "god zij dank" of is het zei ? ;-).
SELECT
p.product_id,
c.category_id,
cl.lang_value,
IFNULL(GROUP_CONCAT(DISTINCT options SEPARATOR '_'), NULL) AS options
FROM
products p
JOIN
category c
ON p.category_id = c.category_id
LEFT JOIN
category_lang cl
ON c.category_id = cl.category_id AND lang_id = 'NL'
LEFT JOIN
(SELECT
opcat.category_id,
CONCAT_WS(';', optlan.option_label, GROUP_CONCAT(DISTINCT ovl.key,'|',ovl.value ORDER BY ovl.value) ) AS options
FROM
options_categories opcat
INNER JOIN
options opt
ON opt.option_id = opcat.option_id
INNER JOIN
options_lang optlan
ON optlan.option_id = opt.option_id
INNER JOIN
option_values ov
ON ov.option_id = opt.option_id
INNER JOIN
option_values_lang ovl
ON ovl.value_id = ov.value_id
WHERE optlan.lang_id = 'NL' AND ovl.lang_id = 'NL'
GROUP BY optlan.option_label ) t
ON t.category_id = c.category_id
WHERE p.display =1
GROUP BY p.product_id
Ik hoop hier alleen dat je niet afhankelijk bent van het gedrag van de foute GROUP BY. Anders zul je nog wat dingen moeten omgooien: in GROUP BY *moeten* alle velden genoemd worden die geen aggregate zijn.
Je GROUP BY moet de volgende velden hebben: p.product_id, c.category_id en cl.lang_value. Wanneer je dit niet doet levert je query op het oog correcte resultaten maar doet de database in werkelijkheid maar wat. Het kan dus gebeuren dat je compleet foute resultaten terugkrijgt na verloop van tijd. Het is verstandig om ONLY_FULL_GROUP_BY toe te voegen aan de sql_mode zodat je direct melding krijgt als je GROUP BY niet klopt. Dit verandert het gedrag naar zoals hoe echte databases het ook doen.