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  | 
+----+-------------------+------------------+ 

를 얻을 수 JSON ON 가입 :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]'하지만 난 몰라 알고 스트림 서버 (1과 15)에서 모든 값을 읽는 법을 배우는 법을 배우고 마녀를 추가하는 것은 그 두 사람의 애호가입니다.

+0

많은 댓글을 삭제했기 때문에 삭제되었습니다. \t 'id', 'stream_id' 및'server_id' 열이있는'stream_server'라는 연결 테이블을 만드는 것이 좋습니다. 이것을보다 나은 최적의 JOIN 문을 작성할 수있는 방법으로 정규화라고합니다. 행운을 빕니다 –

+0

나는 당신이 묘사 한 다른 방법으로 데이터를 정의 할 필요가 있음을 안다. 그러나 나는이 행과 테이블 구조를 내 시스템 전체에 연결했다. (편집 삭제는 비활성화를 활성화한다 ...) 그래서 나는 이것을 하나의 질의 또는 두 가지 쿼리 ... – John

+0

JSON의 모든 유효한 항목에 대해 이것은 하나의 항목 또는 두 항목 또는 10 개의 항목이 될 수 있습니다. 별도의 LEFT JOIN이 필요합니다. 더 나은 해결책이 없습니다. –

답변

1

두 번째 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

고마워.하지만 당신의 쿼리를 실행하면이 오류가 발생 : 오류 1066 (42000) : 고유하지 않은 테이블/별칭 : '스트림'그리고 때때로 json의 두 숫자가 때때로 하나입니다. json의 값이 10이기 때문에이 [0]과 $ [1]은 좋지 않습니다. – John

+0

@John "그리고 또한 때로는 거기에 거기에 두 개의 숫자가 때때로 json에 있습니다 e..and 때로는 10 개의 값입니다. "그렇다면 열 id, stream_id 및 server_id가있는 stream_server라는 연결 테이블을 작성하는 것이 좋습니다.이 작업은 정규화 –

+0

이라고합니다.하지만이 작업은 하나의 쿼리에서 실행할 수 있습니다. ? LEFT JOIN에 가입하십시오. servers.id에서 streams.server json? 이 방법은 가능하다면 하나의 쿼리 ..... 위의 방법은 2 번 쿼리를 실행해야하고 서버가 큰 부하를 받고있을 때 이것이 좋지 않을 때 수행 할 수 있습니다. – John

관련 문제