2017-02-11 4 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   | 
+----+-------------------+ 

Ich brauche links auf Tabellenströme laufen JOIN und ersten Index in streams.server Wert von servers.server mit abzurufen:mysql JSON LEFT JOIN

Für Beispiel beitreten muß ich links um dieses Ergebnis zu erhalten:

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

So ist der Punkt, erster Index von streams.server Hexe zu erhalten ist, 1 und dann LEFT JOIN auf servers.id servers.server Namen Hexe ist in diesem Fall Haupt

ich installierte mySQL 5.7 zu erhalten Version witc h enthält JSON-Unterstützung, aber ich habe keine Ahnung, wie LINKE VERBINDUNG auf JSON-Feldtyp zu verwenden?

Antwort

1

Ich glaube, Sie wollen:

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

Abhängig von der genauen Version von MySQL Sie installiert, können Sie auch s.server->'$[0]' verwenden können.

+0

Ich bekomme NULL für se.server Feld ... – John

+0

@John. . . Sie müssen möglicherweise mit dem 'json_extract()' herumspielen. Zum Beispiel deuten die Anführungszeichen an, dass die Werte im json-Feld als Strings gespeichert sind, während die Werte in "servers" wie Ints aussehen. –

+0

danke ich habe es funktioniert mit Cast ... – John

0

Beispiel:

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

Ich habe es workijng Ihre oben genannten Lösungen mit:

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

Dank.