2017-02-11 305 views
0
TABLE streams; 

+----+----------+-------------------------------------------------------------+-------------+-------------+ 
| id | name  | stream              | server  | bouquet  | 
+----+----------+-------------------------------------------------------------+-------------+-------------+ 
| 1 | HOME  | ["http://ur11.com/", "http://ur12.com/"]     | ["1", "3"] | ["3","2"] | 
+----+----------+-------------------------------------------------------------+-------------+-------------+ 

TABLE servers; 

+----+-------------------+ 
| id | server   | 
+----+-------------------+ 
| 1 | Main    | 
| 2 | Server #1   | 
| 3 | Server #2   | 
| 4 | Server #3   | 
| 5 | Server #4   | 
+----+-------------------+ 

我需要運行LEFT JOIN表流和使用servers.server的streams.server值第一個索引檢索:MySQL的JSON LEFT JOIN

比如我需要左連接來得到這樣的結果:

+----+----------+-------------------------------------------------------------+-------------+-------------+ 
| id | name  | stream              | server  | bouquet  | 
+----+----------+-------------------------------------------------------------+-------------+-------------+ 
| 1 | HOME  | ["http://ur11.com/", "http://ur12.com/"]     | Main  | ["3","2"] | 
+----+----------+-------------------------------------------------------------+-------------+-------------+ 

所以關鍵是要得到streams.server女巫第一指數爲1,然後LEFT JOIN上servers.id得到servers.server名女巫是在這種情況下,主要

我mysql安裝5.7版本witc h包含JSON支持,但我沒有弄清楚如何在JSON字段類型上使用LEFT JOIN?

回答

1

我想你想:

select s.*, se.server 
from streams s join 
    servers se 
    on se.id = json_extract(s.server, '$[0]'); 

根據你安裝了MySQL的確切版本,你也可以使用s.server->'$[0]'

+0

我得到NULL爲se.server字段... – John

+0

@約翰。 。 。你可能不得不擺弄'json_extract()'。例如,雙引號表明json字段中的值存儲爲字符串,而「servers」中的值看起來像整數。 –

+0

感謝我使用演員工作... – John

0

例如:

SELECT * 
FROM foo 
CROSS JOIN LATERAL json_array_elements (foo.bars :: json) foo_bars 
LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID; 

Link

0

我得到了它workijng使用上述解決方案:

select s.*, se.server 
from streams s left join 
servers se 
on se.id = CAST(json_extract(s.server, '$[0]') AS UNSIGNED); 

感謝。