Mam tabelę z polem, które czasami zawiera wiele tablic w formacie JSON.

MYSQL 8.0.11

Dll.

CREATE TABLE T
    (`user` varchar(4), `sales` int, `reference` varchar(400) DEFAULT NULL, `quantity` float DEFAULT NULL, `orders` int)
;

Dane

INSERT INTO T
    (`user`, `sales`, `reference`, `quantity`, `orders`)
VALUES
    ('xx01', 100, '[{"productid":"80000052","quantity":"1","reference":"ML-41"},{"quantity":1,"reference":"ML-32","productid":"ML-52"},{"productid":"80000052","quantity":3,"reference":"ML-11"}]', 0, 0),
    ('xx02', 200, '[{"productid":"80000052","quantity":2}]', 0, 0),
    ('xx02', 400, '[{"productid":"80000052","quantity":3}]', 0, 0),
    ('xx03', 300, '[{"productid":"80000052","quantity":4}]', 0, 0),
    ('xx03', 500, '[{"productid":"80000052","quantity":5}]', 0, 0)
;

Następujące zapytanie aktualizuje pole „quantity” wartością „quantity” w tablicach JSON pola „referencje”:

UPDATE T t2, 
( SELECT sales, quant FROM T, JSON_TABLE(T.reference,
    "$[*]" COLUMNS(
        quant VARCHAR(400) PATH "$.quantity"
        )
    ) AS jt1
) t1
SET t2.quantity = t1.quant
WHERE t1.sales = t2.sales;

Zapytanie pobiera „ilość” z pierwszej tablicy pierwszego wiersza i ignoruje kolejne 2 tablice w polu „odwołanie” tego wiersza.

Czy istnieje sposób na zsumowanie „ilości” wszystkich 3 tablic pola „odniesienia” pierwszego wiersza?

2
BaliJack 13 listopad 2018, 11:46

1 odpowiedź

Najlepsza odpowiedź

Zamiast WHERE użyj JOIN ... ON plus GROUP BY i SUM() AS

UPDATE T t2
  JOIN (SELECT sales, SUM(quant) AS qu FROM T, JSON_TABLE(T.reference,
            "$[*]" COLUMNS(
                quant VARCHAR(400) PATH "$.quantity"
                )
            ) AS jt1
        GROUP BY sales) t1
  ON t2.sales = t1.sales
SET t2.quantity = t1.qu;

db-fiddle

1
BaliJack 14 listopad 2018, 04:16