2017-09-18 6 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  | 
+----+-------------------+------------------+ 

を取得するためにJSONでJOIN:MySQLのLEFT、私は結果のためにこれを取得する必要がある値に

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

だから基本的に私はストリームテーブルサーバフィールドから取得する必要があるとそのフィールドは、サーバテーブルから読み出すために必要なものサーバーは上記のreultテーブルのようにダウンロードが少なく、そのサーバーを返します。

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

だから、私はその後、恋人のダウンロードを持っているもの比較できるように...私が知っている問題は、「$ [0]」ですが、私は知らない...結果ではない2からの最初のサーバーのみを取得しますどのようにストリームサーバー(1と15)からすべての値を読み取るし、魔女を追加するには、その2つの恋人です...私は何が欠けている?

+0

多くのコメントが削除されています。 \t 'stream_server'という名前の' id'、 'stream_id'、' server_id'という名前の接続テーブルを作成することをお勧めします。これは、より良い最適なJOIN文を書くことができるように正規化と呼ばれています。幸運 –

+0

私はあなたが説明した方法以外の方法でデータを定義する必要があることを知っています。しかし、この行とテーブル構造を私のシステム全体に接続しています(編集の削除を追加すると無効になります...) 2つのクエリ... – John

+0

これはJSONのすべての有効な項目に対して、これは1つの項目か2つの項目か10個の項目に分けることができますLEFT JOINより良い解決策はありません –

答えて

1

もう一度このように2番目のJSON値とLEFT JOINを抽出する必要があります。

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

ありがとう..しかし、私はあなたのクエリを実行するときにこのエラーを取得しています:ERROR 1066(42000) :一意ではないテーブル/エイリアス: 'ストリーム'また時にはjsonの2つの数字が時々1つです。jsonでは10個の値がありますので、この[0]と$ [1]は良くありません – John

+0

@John "そして時にはそこには時にはジーンの2つの数字があるe..and時には10の値です "次に、列id、stream_id、およびserver_idを持つstream_serverという名前の接続テーブルを作成するようアドバイスします。これは正規化と呼ばれます –

+0

Okですが、これを1つのクエリで実行できる方法はありますか? LEFT JOINをストリームするにはserver.id?この方法は可能ですそれは1つのクエリ.....上記の方法で行うことができます2回のクエリを実行する必要がありますし、サーバーが大負荷の下でこれは良くない – John

関連する問題