我在 db 表中有一個 JSON 型別的列。
此列將存盤此類值:
column 1: ["bmw", "opel", "audi"]
column 2: ["opel", "bwm", "audi"]
column 3: ["audi"]
值的順序和總數不同,但通常有一個要存盤的有效值串列。
在 UI 上,有一個包含可以排序的列的表。當用戶單擊列Car BrandASC 時,我需要根據上面提到的列值對 db 的輸出進行排序。
我想收到以下輸出:
1: ["audi"]
2: ["audi", "bmw", "opel"]
3: ["audi", "bmw", "opel"]
我似乎無法使用 JSON 路徑找到解決方案。
有誰能夠幫助我?
請不要建議以不同的方式存盤值,這不是我決定的。
uj5u.com熱心網友回復:
你不能在 MySQL 中做到這一點。
Akina 在上面的評論中描述的就像這個演示:
set @j = '["opel", "bwm", "audi"]';
select * from json_table(@j, '$[*]' columns (a varchar(10) path '$')) j order by a;
------
| a |
------
| audi |
| bwm |
| opel |
------
然后想法是使用 JSON_ARRAYAGG() 將這些行重新組合成一個 JSON 陣列。但是,這不起作用:
select json_arrayagg(a) as j from (
select * from json_table(@j, '$[*]' columns (a varchar(10) path '$')) j order by a
) as a;
-------------------------
| j |
-------------------------
| ["opel", "bwm", "audi"] |
-------------------------
子查詢中的 ORDER BY 已被分解。MySQL 認為沒有理由對派生表中的行進行排序,它們應該作為外部查詢的最后一步進行排序。
https://dev.mysql.com/doc/refman/5.7/en/aggregate-functions.html#function_json-arrayagg說:
JSON_ARRAYAGG(col_or_expr)
將結果集聚合為單個 JSON 陣列,其元素由行組成。此陣列中元素的順序未定義。
https://bugs.mysql.com/bug.php?id=94696是 2019 年的一項功能請求,要求在使用 JSON_ARRAYAGG() 聚合元素之前對元素進行排序。該票證處于“已驗證”狀態,這意味著它已作為功能請求被接受,但尚未實施。
MySQL 8.0 中還沒有使用 JSON_ARRAYAGG() 以特定順序生成陣列的解決方案。
因此,您可以做的最好的事情是將它們作為已排序的行獲取,正如我在此答案前面的中間步驟中所示,然后在您的客戶端應用程式代碼中按該順序將它們組合成一個陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/468613.html
標籤:mysql mysql-json
