2015-11-01 12 views
0

В моей таблице игроков MySql У меня есть столбец с именем achievements и это текстовое поле, которое в данном ряде имеет следующее значение:MySQL получает значение JSON

[ 
    { 
     "value":11, 
     "globalID":23000000 
    }, 
    { 
     "value":11, 
     "globalID":23000001 
    }, 
    { 
     "value":11, 
     "globalID":23000002 
    }, 
    ... 
    { 
     "value":6044730, 
     "globalID":23000065 
    } 
] 

В нижней части массива вы можете увидеть это объект:

{ 
    "value":48, 
    "globalID":23000062 
}, 

мне нужно, чтобы быть в состоянии разобрать поле значения и показать его как warhero поле. Но как я могу это сделать? Глобальный идентификатор останется неизменным, но значение изменится. И поскольку globalID после значения value, я не могу использовать то, что было использовано в этом сообщении: https://stackoverflow.com/a/21596032/4942382

Какой SQL-запрос мне нужно выполнить, чтобы получить это значение?

Спасибо!

+0

Вам нужно только одно значение из этого списка? Или почему вы выделяете конкретный объект? У вас есть 'globalID' up-fromt и хотите извлечь соответствующее' значение'? – trincot

+0

@ trincot yes Я хочу иметь возможность извлечь значение для соответствующего глобального идентификатора, но без необходимости получать все значение поля –

+0

Любые идеи о том, как это сделать? –

ответ

0

Конструкция стола даже не встретится первый уровень нормализации, если он хранит не-атомарное значение в одном столбце, что и в случае с этим типом JSON кодируемых значений.

Теперь, если у вас нет доступа к JSON функциям available to MySql version 5.7+, и ваш globalID имеет фиксированное количество цифр, то вы могли бы сделать некоторые строки соответствия следующим образом.

Например, если вам нужно значение, которое идет с globalID 23000062, то вы можете сделать это:

SELECT players.*, 
     CAST(
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(achievements, '"globalID":23000062', 1), 
       '"value":', 
       -1 
      ) 
     AS UNSIGNED) AS json_extracted_value 
FROM players 
WHERE INSTR(achievements, '"globalID":23000062') > 0 

Но на самом деле, вы должны серьезно рассмотреть вопрос о реорганизации базы данных.

1

Вы никогда бы не сохранили JSON в своей таблице, вы уже нарушили правила проектирования реляционных баз данных.

mysql не может иметь смысл данных, поэтому не SQL-запрос не поможет, у вас есть 2 варианта:

  • Фикс структуры базы данных, создавать таблицы для хранения этих данных вместо JSON
  • Позовите данные, декодировать JSON и выполнять все типы манипуляций и взломов, чтобы получить желаемое значение.
+0

MySql 5.7 Supprorts JSON. –

+0

Моя точка зрения заключалась в том, что JSON не используется как родной способ хранения данных. Интересно, хотя я не знал об этом, но все же не очень хорошо. в любом случае я просто посмотрел его и нашел это https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.HTML # function_json-поиск – meda

Смежные вопросы