2017-06-14 3 views
0

Ich habe diese Anfrage:Erreichen verschachtelte Group_concat

select p.id, 
     p.price, 
     concat('[',group_concat(concat('{',concat_ws(',', concat('color:', pc.color),concat('sizeName:',cs.size_name)),'}')),']') as variety 

     from tbl_products as p 

    inner join tbl_product_colors as pc on p.id = pc.product_id 
    left join tbl_color_sizes as cs on pc.id = cs.product_color_id 

group by p.id; 

Abfrage über Ausgänge:

Id | price | variety 
1 | 1000 | [ {color:FFFFFF, sizeName:XL} , {color:FFFFFF, sizeName:X} ] 

Aber meine gewünschte Ausgabe ist:

Id | price | variety 
1 | 1000 | [ {color:FFFFFF, sizes: [ {sizeName: XL} , {sizeName: L} ] } ] 

Frage: Wie kann ich group_concat in diesem Kontext oder eine andere Funktion (neben der JSON-Funktion) verwenden, um die gewünschte Ausgabe zu erreichen?

+0

Was wäre die gewünschte Ausgabe, wenn Produkt 1 mehrere Farben hätte? – Uueerdo

+0

[{color: FFFFFF, Größen: [{sizeName: XL}, {sizeName: L}]}, {color: F2F2F2, Größen: [{sizeName: XL}]}] – Sajad

+0

Und das wäre eine einzige 'Varieté' Feldwert? – Uueerdo

Antwort

2

In fast allen Fällen erfordern Ergebnisse, die eine Verschachtelung erfordern, "verschachtelte" Abfragen. Sie würden die "Größenliste" in einer Unterabfrage machen, die auf den äußeren Gruppierungsdimensionen UND den Feldern gruppiert ist, die in der äußeren Abfrage zusammen gruppiert werden sollen; und aggregieren dann in der äußeren Abfrage das Feld (die Felder) mit der "Größenliste", die mit ihnen verkettet ist.

So etwas, aber ich habe die meisten der zusätzlichen CONCATs für die Lesbarkeit weggelassen.

SELECT subQ.id, subQ.price 
    , GROUP_CONCAT(CONCAT(subQ.color, ': ', subQ.sizeList)) AS variety 
FROM (
    SELECT p.id, p.price, pc.color 
     , GROUP_CONCAT(cs.size_name) AS sizeList 
    FROM tbl_products AS p 
    INNER JOIN tbl_product_colors AS pc ON p.id = pc.product_id 
    LEFT JOIN tbl_color_sizes AS cs ON pc.id = cs.product_color_id 
    GROUP BY p.id, p.price, pc.color 
) AS subQ 
GROUP BY subQ.id, subQ.price 
;