台灣最大程式設計社群網站
線上人數
1114
 
會員總數:240373
討論主題:186362
歡迎您免費加入會員
討論區列表 >> MySQL >> Mysql json 排序問題
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Mysql json 排序問題
價值 : 50 QP  點閱數:693 回應數:11

樓主

ㄚ宏
初學者
36 56
433 57
發送站內信

table:test_json
field:id,data_json

id=1
data_json=

[
{"CODE": "C0", "PARA": "57f01060002024900010000", "TIME_STAMP": "23:45:45"},
{"CODE": "C0", "PARA": "57f01060002125500010000", "TIME_STAMP": "21:45:45"},
{"CODE": "C0", "PARA": "57f01060002027400010000", "TIME_STAMP": "21:45:45"}
]



結果如下:
["23:45:45", "21:45:45", "21:45:45"]

請教一下各位高手,想在這堆數組中做排序,嘗試了一下ASC或DESC,結果都一樣,請問一下那裡錯了呢?
謝謝!!

搜尋相關Tags的文章: [ json ] ,
本篇文章發表於2017-05-10 16:08
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

彩虹
檢舉此回應
裡面的值無法做排序的,你只是提取出來而已

order by 是針對資料表欄位的每一列值做排序
而不是使用在 json 裡面數組值的排序


我想你還是乖乖的撈出資料後,再透過程式呈現排序

本篇文章回覆於2017-05-10 17:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
建議將那個欄位的JSON值改成另一張資料表
然後利用外聯的方式來取資料
本篇文章回覆於2017-05-11 09:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

ㄚ宏
檢舉此回應
Hi 彩虹
謝謝您的提議,不行的話只能用程式做了

Hi 迷路
json欄位裡面的資料,其實一開始就是獨立資料表,只是每小時有60萬筆資料Insert,最後上層決定先濃縮資料量,再定期匯出
有硬體預算考量...
本篇文章回覆於2017-05-11 09:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
把資料表串成JSON格式字串能減少資料量?
本篇文章回覆於2017-05-11 13:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
json可是有長度限制的。太多也是不行的。

一般來說會搭配join的方式來做資料庫的取得處理。或是子查尋的方式
搞不好會比你目前用的方式還要更快。
或許你可以將你的需要及資料表的節構說明一下。或許可以給你更好的建議
本篇文章回覆於2017-05-17 17:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

ㄚ宏
檢舉此回應
我說明一下資料來源
目前有1000感測器 每秒都在拋資料到我的DB
每天有60*60*24*1000 = 86400000筆資料

這些資料需要做高溫、低溫、平均、及筆數統計,後續怕跑報表如日報、週報、月報、季報、年報,怕咬住DB,
所以最後上頭採用將資料進DB的時後就先行運算好,但原有資料則存放在json中,後續有需要時備查使用。

資料表欄位簡單描述一下
id、device、day、hour、max、min、avg、json_data

目前資料進出都是同一台DB主機,然後又有硬體成本考量XD


因為是第一次碰到要處理這麼大的資料量,如各位高手有更好的建議,請提供建議我在另外做改善。
本篇文章回覆於2017-05-31 18:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
連年報都有的話,你的資料總筆數應該突破百億大關
這麼龐大的資料量還真的是沒碰過
你們後續的報表或備查還有需要個別的原始資料嗎?
如果不需要,只要將單日(或是單週/單月)的原始資料保存在一張表
將超過保存範圍的資料輸出成JSON字串的文字檔儲存在硬碟中,然後從資料表中刪除
另外用一張表記錄運算後的統計資料

因為沒有實際接觸過樓主的情況
所以我無法給出肯定的建議
但是很難想像在百億級別的資料中,會有需要找出特定感測器在某一秒的資料的需求
最大、最小是比較值,所以不需要原始資料
以平均值取平均值可能會造成微小的誤差,所以可額外存累加值和筆數,這樣計算平均值就不會有誤差了
本篇文章回覆於2017-06-01 11:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
日報、週報、月報 這些不需要及時性的東西,
建議每天找個時間用個程式跑一次把每秒的資料塞去其他table
以後要撈資料就去那個裡面撈。
每秒的資料就留著吧...基本上我想也不會有人去看。
本篇文章回覆於2017-06-01 11:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

ㄚ宏
檢舉此回應
因為我也是第一次碰到這種大資量的情況,所以還在試著看看有沒有更好的做法

HI Daimom
跑報表功能過去也是用排程的方式在特定時間點做背景處理,但因為資料過大時,在處理時會有咬住DB的情況,
造成前端感測器送進來的資料有嚴重的延遲處理情行,Server在處理資料之後還是需要回應給感測器訊息的,
也就是會造成感測器延遲收到訊息,收到訊息之後才有後續的動作...當然有些時後也是有關整個系統設計的問題。
因為每秒都有資料在進入,基本上頭表示不希望資料在交遞的過程中有延遲的情況...

Hi 迷路
資料在存一段時間之後,會有將資料搬移的動作,資料屬於醫療相關儀器使用的。

感謝提供寶貴意見!!

本篇文章回覆於2017-06-01 17:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
那可以換另一個方式,不過就真的不是單純靠sql了。
先透過後端程式將資料撈出(請在另一台server上做),
然後資料的處理都在程式上做,
而不是資料庫,這樣處理時就不會有咬住的情況。
本篇文章回覆於2017-06-02 08:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
你可以用一個資料表來建立每秒的資料(可搭配分表),再依最小單位來做統計。依照你的說明,我認為是依一日為單位是最好的。

所以可以在00:00的時間,將昨天的資料統計成一筆資料放到統計的另一張表上。
以後無論是日表、週表、月表就可以從這邊去做統計處理。無需往大資料表的記錄表中做統計。

這才是最好的處理方式
本篇文章回覆於2017-06-03 15:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.