2017-02-01 7 views
0

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
  1. ブレイクの提案
  2. DEDの提案
  3. 合わせansweroptionsとのDEDスクリプトはそれに応じて修正使用。

私は結果forループ* 100回使用され、ここにある:に基づいて、だから、

秒秒

  • 0.0005500316619873

    1. 0.16780591011047秒
    2. 0.0067291259765625をDB内で一対多の関係を使用することは、必ずしも最良の選択ではないという結論に至りました。このような単純なタスクでは、すべてのデータを同じテーブルに格納できます。

      ご協力いただきありがとうございます。

  • +0

    を試してみてください、私はあなただけであなたのコードの最後にあなたのためのループを削除する必要があると思います。 'echo json_encode($ jsonarray [$ d]);'をループに入れないでください。 – bassxzero

    +0

    @bassxzeroアドバイスありがとう!これを調べるかもしれない他の人のために、私は[$ d]を削除する必要があり、それはうまくいった: 'json_encode($ jsonarray);'。 – Dmitry

    +0

    そのdに気が付かなかったが、それは行く必要がある – bassxzero

    答えて

    0
    $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;"; 
    
    $result = $conn->query($sql); 
    $jsonarray = mysqli_fetch_all($result, MYSQLI_ASSOC); 
    
    foreach ($jsonarray as $row) { 
        $row["answeroptions"] = explode(",", $row["answeroptions"]); 
    } 
    
    echo json_encode($jsonarray)."<br>"; 
    
    0

    最高のパフォーマンスを得るには、実際に2つのクエリを実行する必要があります。 (未テスト)このコード

    # Question array holder 
    $questions = []; 
    
    
    # Loading the questions 
    $query = " SELECT 
           `id`, 
           `question`, 
           `correctanswer` 
          FROM 
           `tabl1`"; 
    $result = mysqli_query($conn, $query); 
    
    
    # Nothing to send 
    if(mysqli_num_rows($result) == 0) { 
        exit('[]'); 
    } 
    
    
    # Adding questions to array 
    while($question_data = mysqli_fetch_assoc($result)) { 
        $question_data[ 'answeroptions' ] = []; 
        $questions[ $question_data[ 'id' ] ] = $question_data; 
    } 
    
    
    # Loading the answer 
    $query = " SELECT 
           * 
          FROM 
           `tabl2` 
          WHERE 
           `questionid` IN (" . implode(',', array_keys($questions)) . ")"; 
    $result = mysqli_query($conn, $query); 
    
    
    # Adding answers to array 
    while($answer_id = mysqli_fetch_assoc($result)) { 
        $questions[ $answer_id[ 'questionid' ] ][ 'answeroptions' ][] = $answer_id[ 'answeroptions' ]; 
    } 
    
    
    # Sending the questions 
    echo json_encode(array_values($questions)); 
    
    +0

    ありがとう@ blake-a-nichols、その作品!同じ結果を得るために1つのSQLクエリを使用する方法がないことを意味しますか? – Dmitry

    +0

    私は認識していません。テーブルを適切に索引付けでき、mysqlがデータを取得するために必要な作業を制限しているため、2つの問合せメソッドは常により迅速になります。 –

    +0

    @blake-a-nichols 2番目のテーブルを削除してすべての回答をtbl1に移動するとどうなりますか?コンマで区切られた文字列を含むvarcharカラムを作成し、それを配列に分解するだけです。 2つのクエリを実行するよりも速くなるでしょうか? 2つから5つのオプションがありますが、それ以上はありません。 (Excelで自分で書くので、質問を管理するのは間違いなく簡単です。)[編集:文法] – Dmitry

    関連する問題