2016-07-21 9 views
0

Vielleicht ist es, dass ich müde bin, aber das entkommt mir.Eine Tabelle in Prep für Json abflachen

Lassen Sie uns sagen, dass ich diesen Tisch glätten wollen:

a_id a_val b_id b_val c_id c_val d_id d_val 
1  a  10  b  100 c  1000 f 
1  a  20  d  200 g  null null 
2  e  30  h  300 i  null null 
2  j  40  k  null null null null 
3  l  null null null null null null 

In diese Abfrage-Ergebnis:

id mystring 
1, (1:a,10:b,100:c,1000:f),(1:a,20:d,200:g) 
2, (2:e,30:h,300:i),(2:j,40:k) 
3, (3:l) 

Die Tabelle macht nur vier Ebenen tief (a, b, c, d) so kein dynamisches SQL-Problem

Jetzt würde ich normalerweise nur GROUP_CONCAT (CONCAT (...)) verwenden, aber das wird nicht mit den NULLEN vorhanden funktionieren. Und vielleicht hilft es irgendwie, das Problem zu lösen, aber ... Ich fühle mich im Moment ziemlich dumm ... und ich kann es nicht verstehen.

Leider kann ich nicht MySQL-JSON-Dienste für diese Installation verwenden, also muss ich die Daten erstellen. Vielen Dank.

+0

Ich glaube, Sie können Nest die verschmilzt in den concats, so dass der concat immer einen Wert anstelle von null – Mackers

Antwort

1

Die Lösung hier wird wahrscheinlich nur eine Kombination aus cleveren Verkettung und IFNULL Anrufe sein. Mein Schuss im Dunkeln:

SELECT a_id, GROUP_CONCAT(CONCAT('(', 
    a_id, ':', a_value, ',', 
    IFNULL(b_id, ''), IF(b_id IS NOT NULL, ':', ''), IFNULL(b_val, ''), 
    ...repeat for c and d 
    ')' 
) SEPARATOR ',') 
FROM table 
GROUP BY a_id; 
+0

Yep machen. Das wird es gut machen. Vielen Dank. –

1
select a_id as id, 
group_concat(concat(
case isnull(a_id) when true then '' else '(' end, 
coalesce(a_id, ''), 
case isnull(a_id) when true then '' else ':' end, 
coalesce(a_val, ''), 
case isnull(b_id) when true then '' else ',' end, 
coalesce(b_id, ''), 
case isnull(b_id) when true then '' else ':' end, 
coalesce(b_val, ''), 
case isnull(c_id) when true then '' else ',' end, 
coalesce(c_id, ''), 
case isnull(c_id) when true then '' else ':' end, 
coalesce(c_val, ''), 
case isnull(d_id) when true then '' else ',' end, 
coalesce(d_id, ''), 
case isnull(d_id) when true then '' else ':' end, 
coalesce(d_val,''), 
case isnull(a_id) when true then '' else ')' end 
) separator ',') 
from table 
group by a_id; 
+0

Das ist es. Vielen Dank. :) –