2017-09-18 1 views
1
Streams: 

+----+-----------+ 
| id | server | 
+----+-----------+ 
| 1 | ["1","15"]| 
+----+-----------+ 

Servers: 

+----+-------------------+------------------+ 
| id | server   |  download | 
+----+-------------------+------------------+ 
| 1 | Server #1   |  2.05  | 
| 2 | Server #2   |  23.96  | 
| 3 | Server #3   |  8.08  | 
| 15 | Server #15  |  3.03  | 
+----+-------------------+------------------+ 

Ich brauche für Ergebnis so erhalten:MySQL LEFT JOIN ON JSON Werte erhalten

+----+-----------+--------------+ 
| id | server | download | 
+----+-----------+--------------+ 
| 1 | Server #1 |  2.05  | 
+----+-----------+--------------+ 

Also im Grunde muss ich aus Strömen Tabelle Server-Feld bekommen und das Feld müssen von Servern Tabelle lesen, was Server haben einen niedrigeren Download und geben diesen Server wie oben beschrieben zurück.

SELECT servers.server FROM servers 
LEFT JOIN streams ON servers.id=CAST(json_extract(streams.server, '$[0]') AS 
UNSIGNED) 
WHERE streams.id=1; 

So bekomme ich nur die ersten Server aus dem Ergebnis nicht zwei ... so dass ich dann vergleichen, was hat Liebhaber download ... ich weiß, dass Problem ist ‚$ [0]‘, aber ich weiß nicht, wie man links beitritt oder wie man alle werte von streams server liest (1 und 15) und dann hinzufügt, wesse ist lover von diesen zwei ... was fehlt mir?

+0

Meine Frage gelöscht, weil die vielen Kommentare. \t Ich rate Ihnen, eine Verbindungstabelle namens 'stream_server' mit den Spalten' id', 'stream_id' und' server_id' zu erstellen. Dies nennt man Normalisierung, so dass Sie eine bessere optimale JOIN-Anweisung schreiben können. Viel Glück –

+0

Ich weiß, dass ich andere Daten definieren muss, die Sie beschrieben haben..aber ich habe diese Zeilen und Tabellenstruktur mit meinem ganzen System verbunden (fügen Sie hinzu, bearbeiten Sie löschen aktivieren deaktivieren ...), also muss ich dies in einer Abfrage oder bekommen zwei Abfragen ... – John

+0

für jedes gültige Element in der JSON könnte dies ein Element oder zwei Elemente oder zehn Elemente sein, die Sie benötigen eine separate LINKE JOIN gibt es keine bessere Lösung –

Antwort

1

Ich denke, Sie sollten auch den zweiten JSON-Wert und LEFT JOIN es wieder so extrahieren.

SELECT servers.server FROM servers 

LEFT JOIN streams ON servers.id = CAST(json_extract(streams.server, '$[0]') AS 
UNSIGNED)  
LEFT JOIN streams ON servers.id = CAST(json_extract(streams.server, '$[1]') AS 
UNSIGNED) 

WHERE streams.id = 1; 
+0

Danke..aber ich bekomme diesen Fehler beim Ausführen Ihrer Abfrage: Fehler 1066 (42000) : Nicht eindeutig Tabelle/Alias: 'Streams' Und auch manchmal gibt es zwei Zahlen in JSON manchmal ist ein .. und manchmal ist 10 Werte in JSON so diese $ [0] und $ [1] ist nicht gut – John

+0

@John "Und auch manchmal sind da zwei nummern in json manchmal an e..und manchmal sind 10 Werte "Dann rate ich Ihnen, eine Verbindungstabelle namens stream_server mit Spalten id, stream_id und server_id zu erstellen. Dies nennt man Normalisierung –

+0

Ok..aber gibt es eine Möglichkeit, dass ich dies in einer Abfrage ausführen kann ? zu LINKEN JOIN streams.server json ON servers.id? Auf diese Weise, wenn es möglich ist, kann es in einer Abfrage durchgeführt werden ..... oben Weg muss ich 2 mal Abfrage ausführen und wenn der Server unter großer Last ist, wird dies nicht gut sein – John