我有這張桌子:
CREATE TABLE stackoverflow_question (
id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
json_ob mediumtext default null,
PRIMARY KEY (id)
);
我做了一些插入:
insert into stackoverflow_question values(null, 'albert', '[{name: "albert1", qt: 2},{name: "albert2", qt: 2}]');
insert into stackoverflow_question values(null, 'barbara', '[{name: "barbara1", qt: 4},{name: "barbara2", qt: 7}]');
insert into stackoverflow_question values(null, 'paul', '[{name: "paul1", qt: 9},{name: "paul2", qt: 11}]');
最終,我需要按總量對這張表進行排序。在上面的示例中,“paul”的數量 = 20,而“barbara”的數量 = 11。而“albert”的數量 = 4。
是否可以創建一個動態創建新欄位的選擇陳述句?像這樣的東西:
SELECT
SUM (loop json_ob and sum all the quantity fields) AS total_quantity,
id,
name
FROM
stackoverflow_question
ORDER BY total_quantity
uj5u.com熱心網友回復:
如果json_ob實際上是一個有效的 json 物件,那么您可以使用它JSON_TABLE()來提取數量和聚合:
SELECT s.*, SUM(t.qt) total_quantity
FROM stackoverflow_question s,
JSON_TABLE(json_ob, '$[*]' COLUMNS (qt INTEGER PATH '$.qt')) t
GROUP BY s.id
ORDER BY total_quantity DESC;
請參閱演示。
uj5u.com熱心網友回復:
根據jsonlint ,您的 JSON 無效。
這就是為什么此 SQL 回傳錯誤 (ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_table: "Missing a name for object member." at position 2.")
SELECT
j.name, j.qt
FROM JSON_TABLE('[{name: "paul1", qt: 9},{name: "paul2", qt: 11}]',
"$[*]" COLUMNS (name varchar(20) PATH "$.name", qt int PATH "$.qt")) j ;
這將回傳值:
SELECT
j.name, j.qt
FROM JSON_TABLE('[{"name": "paul1", "qt": 9},{"name": "paul2", "qt": 11}]',
"$[*]" COLUMNS (name varchar(20) PATH "$.name", qt int PATH "$.qt")) j ;
輸出:
| 姓名 | qt |
|---|---|
| 保羅1 | 9 |
| 保羅2 | 11 |
您可以使用以下工具將您的輕松 JSON 轉換為 JSON:www.relaxedjson.org
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/438123.html
標籤:mysql
下一篇:如何創建確定員工年齡分類的函式
