2017-11-26 12 views
4

私はnodejsを使用してAPIを作成しています。 APIはリクエストを受け取り、JSONで応答しますSQL結果をJSONに変換する適切な方法

たとえば、 私はデータベースにテーブルQUESTIONを持っていますので、エンドポイントhttp://localhost/table/questionへのGETリクエストはJSON形式でテーブルを出力します。

は、しかしそこに行ったときに問題が発生しているテーブルの質問と選択肢を考慮

合流します。質問は多くの選択肢(回答)持っている彼らのでしょう参加

表:私は明白な解決策は、それを解析することで、この

{ 
    "0":{ 
     "QUESTION":"If Size of integer pointer is 4 Bytes what is size of float pointer ?", 
     "OPTION":{ 
     "A":"3 Bytes", 
     "B":"32 Bits", 
     "C":"64 Bits", 
     "D":"12 Bytes" 
     } 
    }, 
    "1":{ 
     "QUESTION":"Which one is not a SFR", 
     "OPTION":{ 
     "A":"PC", 
     "B":"R1", 
     "C":"SBUF" 
     } 
    }, 
    "2":{ 
     "QUESTION":"What is Size of DPTR in 8051", 
     "OPTION":{ 
     "A":"16 Bits", 
     "B":"8 Bytes", 
     "C":"8 Bits" 
     } 
    }, 
    "3":{ 
     "QUESTION":"Is to_string() is valid builtin function prior to c++11 ? ", 
     "OPTION":{ 
     "A":"Yes", 
     "B":"No" 
     } 
    } 
} 

のようなものに変換しようとしています

enter image description here

JOINを使用してクエリを実行し、JSONに変換します。 これを行うための効率的な方法はありますか?

+0

はあなたを行います

テーブル名、フィールド名などは、あなたのアプリケーションで、その後

select q.text as question, group_concat(answer.label, ';;;') as labels, group_concat(answer.text, ';;;') as answers from question as q join answer as a on a.quesion = q.id group by q.text 

そして:-)(nodejs)純粋なファンタジーですGROUP_CONCATでこれを達成することができますPHPにアクセスできますか?それは良いjson_encode関数を持っています。 php –

+1

からMySQLに接続するのに十分なほど簡単にあなたのJSONは私には最適ではないようです。数字キーはトップレベルのIDかインデックスのみですか?後者の場合、それを配列で置き換えると、より意味をなさないでしょう。処理自体については、結果をループして、新しい質問を見つけたら新しいオブジェクトを作成するか、質問が既に存在する場合(つまり、最後に見たり追加したものと同じです)OPTIONSに追加してください。あなたは単純なループを使うこともできますし、 'reduce'を使ってそれを行うこともできます。あなたのデータを 'JSON.stringify'するだけです(Expressを使う場合は' res.json'で出力します)。 – jcaron

+0

注:質問にはMySQLではなくPostgreSQLが含まれていれば、配列や集約関数を使用してSQLですべてのことを簡単に行うことができます。 – jcaron

答えて

1

MySQLでは

let resultRows = callSomeFunctionsThatReturnesAllRowsAsArray(); 
let properStructure = resultRows.map(row => { 
    let texts = row.answers.split(';;;'); 
    return { 
     question: row.question, 
     options: row.labels.split(';;;').map((label, index) => {label: label, answer: texts[index]}); 
    } 
}); 
+0

非常に便利ですが、 'group_concat(answer.label、 ';;;')'を使った1つの改善は、javacriptで分割されたときの最後の位置で空値を生成しましたが、 を使用しました。簡単に修正 – Kashyap

関連する問題