2つのMySQLテーブルから多目的なJSONを作成する必要があります。私のコードはうまくいきますが、まずDB値を連結してPHPで結果の文字列を爆発させるので、書かれていないと思います。これを行うには、より良い(そしてより速い)方法が必要です。PHP - MySQLから多目的なJSONを作成するには?
何度も聞いたことがある類似の質問がありますが、私は自分のケースに答えを適用する方法を理解できません。
だから、私は、次のMySQLテーブルを持っている:
tbl1
-----------------------------
id| question |correctanswer
-----------------------------
1|'Yes or no?'| 'Yes'
2| 'Who?' | 'Peter'
tbl2
-----------------------------
id|questionid| answeroptions
-----------------------------
1 | 1|'Yes'
2 | 1|'No'
3 | 2|'Peter'
4 | 2|'John'
5 | 2|'James'
6 | 2|'Jack'
私はそのようなJSON文字列を構築したい:
{
"id":"1",
"question":"Yes or no?",
"correct_answer":"Yes",
"answeroptions":[
"Yes",
"No"
]
}
{
"id":"2",
"question":"Who?",
"correct_answer":"Peter",
"answeroptions":[
"Peter",
"John",
"James",
"Jack"
]
}
は、ここに私のコードです:
$sql = "SELECT tabl1.id, tabl1.question, tabl1.correctanswer,
GROUP_CONCAT(DISTINCT tbl2.answeroptions)
FROM tabl1
LEFT JOIN tbl2 ON (tabl1.id = tbl2.questionid)
GROUP BY tabl1.id;";
$jsonarray = array();
$result = $conn->query($sql);
$i = 0;
while ($row = mysqli_fetch_array($result, MYSQL_NUM)) {
$jsonarray[$i]["topic"] = $row[0];
$jsonarray[$i]["id"]=$row[1];
$jsonarray[$i]["question"]=$row[2];
$jsonarray[$i]["correct_answer"]=$row[3];
$jsonarray[$i]["answeroptions"] = array();
$jsonarray[$i]["answeroptions"] = explode(",",$row[4]);
$i++;
}
for ($d=0; $d<count($jsonarray);$d++){
echo json_encode($jsonarray[$d])."<br>";
}
はUPD: 私は3つのユースケースについて性能テストを行いました:
第2の要求を排除するTBL1に新しい列に3210- ブレイクの提案
- DEDの提案
- 合わせansweroptionsとのDEDスクリプトはそれに応じて修正使用。
私は結果forループ* 100回使用され、ここにある:に基づいて、だから、
秒秒
- 0.16780591011047秒
- 0.0067291259765625をDB内で一対多の関係を使用することは、必ずしも最良の選択ではないという結論に至りました。このような単純なタスクでは、すべてのデータを同じテーブルに格納できます。
ご協力いただきありがとうございます。
を試してみてください、私はあなただけであなたのコードの最後にあなたのためのループを削除する必要があると思います。 'echo json_encode($ jsonarray [$ d]);'をループに入れないでください。 – bassxzero
@bassxzeroアドバイスありがとう!これを調べるかもしれない他の人のために、私は[$ d]を削除する必要があり、それはうまくいった: 'json_encode($ jsonarray);'。 – Dmitry
そのdに気が付かなかったが、それは行く必要がある – bassxzero