2017-11-20 12 views
0

私はuser_idとuser_detailsを持つuserテーブルを持っています。以下に示すような文字列形式でJSONデータを含む:JSONを解析するSQLクエリ

1-

[{"name":"question-1","value":"sachin","label":"Enter your name?"}, 
    {"name":"question-2","value":"[email protected]","label":"Enter your email?"}, 
    {"name":"question-3","value":"xyz","label":"Enter your city?"}] 

2-

[{"name":"question-1","value":"sachin123","label":"Enter your name?"}, 
    {"name":"question-2","value":"[email protected]","label":"Enter your email?"}, 
    {"name":"question-3","value":"xyz","label":"Enter your city?"}, 
    {"name":"question-4","value":"red","label":"Enter your favourite color?"}] 

3-

[{"name":"question-1","value":"","label":"Enter your name?"}, 
    {"name":"question-3","value":"xyz","label":"Enter your city?"}, 
    {"name":"question-4","value":"red","label":"Enter your favourite color?"}] 

4-

[{"name":"question-1","value":"","label":"Enter your name?"}, 
    {"name":"question-2","value":"[email protected]","label":"Enter your email?"}, 
    {"name":"question-3","value":"abc","label":"Enter your city?"}, 
    {"name":"question-4","value":"pink","label":"Enter your favourite color?"}] 

予想される出力は次のとおり

row Enter your name? | Enter your email? | Enter your city? | Enter your favourite color? 
1 sachin   | [email protected]  | xyz    | - 
2 sachin123  | [email protected]  | xyz    | red 
3 -    | -     | xyz    | blue 
4 -    | [email protected]  | abc    | pink 

私はPHPを介してそれを実行しようとしている、それが配列にJSONに変換し、それを比較することによって可能です。それはMySQLのクエリを使用して直接取得する簡単な方法はありますか?

+0

これについては、[MySQL](https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html)のドキュメントを見てください。私は 'JSON_EXTRACT'はあなたの探しています。 –

+0

通常の方法でデータを保存するほうがずっと良いでしょう。 – Pete

答えて

1

私はこの解決策を考え出した:出力

SELECT user_id, 
    COALESCE(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(user_details, CONCAT(q1, '.value'))), ''), '-') AS 'Enter your name?', 
    COALESCE(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(user_details, CONCAT(q2, '.value'))), ''), '-') AS 'Enter your email?', 
    COALESCE(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(user_details, CONCAT(q3, '.value'))), ''), '-') AS 'Enter your city??', 
    COALESCE(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(user_details, CONCAT(q4, '.value'))), ''), '-') AS 'Enter your favorite color?' 
FROM (
    SELECT user_id, user_details, 
    SUBSTRING_INDEX(JSON_UNQUOTE(JSON_SEARCH(user_details, 'one', 'question-1')), '.', 1) AS q1, 
     SUBSTRING_INDEX(JSON_UNQUOTE(JSON_SEARCH(user_details, 'one', 'question-2')), '.', 1) AS q2, 
     SUBSTRING_INDEX(JSON_UNQUOTE(JSON_SEARCH(user_details, 'one', 'question-3')), '.', 1) AS q3, 
     SUBSTRING_INDEX(JSON_UNQUOTE(JSON_SEARCH(user_details, 'one', 'question-4')), '.', 1) AS q4 
    FROM users) t 

+---------+------------------+-------------------+-------------------+----------------------------+ 
| user_id | Enter your name? | Enter your email? | Enter your city?? | Enter your favorite color? | 
+---------+------------------+-------------------+-------------------+----------------------------+ 
|  1 | sachin   | [email protected] | xyz    | -       | 
|  2 | sachin123  | [email protected] | xyz    | red      | 
|  3 | -    | -     | xyz    | red      | 
|  4 | -    | [email protected] | abc    | pink      | 
+---------+------------------+-------------------+-------------------+----------------------------+ 

しかし、これはそれぞれの質問で見つかったラベルから動的に列にラベルを付けていません。質問-1に対応するラベルがすべての行で同じであるか、または任意の行に存在するという保証がないため、これを行うのは問題です。したがって、クエリを準備する前に、ラベルの内容を決定してクエリの列エイリアスをハードコードする必要があります。

最終的に、PHPでこれを行うのはおそらくもっと簡単です。