0

JSON出力が1つだけ必要なため、これら3つのクエリを結合する方法を知りたいのですが、INNERJOINがこれを行うと思いました。しかし、これを使用する方法がわかりません。誰かが私を正しい道に導いてくれますか?

  $json = array();
$following_string = mysqli_real_escape_string($mysqli,$_SESSION['id']);
$call="SELECT * FROM streamdata WHERE streamitem_id < '$lastID' AND streamitem_target=".$following_string." OR streamitem_creator=".$following_string." ORDER BY streamitem_id DESC LIMIT 10";
$chant = mysqli_query($mysqli, $call) or die(mysqli_error($mysqli));

$json['streamdata'] = array();

while ($resultArr = mysqli_fetch_assoc($chant)) {

    $json['streamitem_id'] = $resultArr['streamitem_id'];
    $json['streamitem_content'] = $resultArr['streamitem_content'];
    $json['streamitem_timestamp'] = Agotime($resultArr['streamitem_timestamp']);

 $json['streamdata'] = $json;
}

/***** COMMENTS *****/
$check = "SELECT comment_id, comment_datetime, comment_streamitem, comment_poster, comment_content FROM streamdata_comments WHERE comment_poster=".$following_string." ";
$check1 = mysqli_query($mysqli,$check);
$json['streamdata_comments'] = array();

while ($resultArr = mysqli_fetch_assoc($check1)) {

    $json['comment_id'] = $resultArr['comment_id'];
    $json['comment_content'] = $resultArr['comment_content'];
    $json['comment_poster'] = $resultArr['comment_poster'];
    $json['comment_datetime'] = Agotime($resultArr['comment_datetime']);
    $json['comment_streamitem'] = $resultArr['comment_streamitem'];

$json['streamdata_comments'] = $json;
}

/***** USERS *****/

$check = "SELECT * FROM users WHERE id=".$following_string."";
$check1 = mysqli_query($mysqli,$check);
$json['users'] = array();

while ($resultArr = mysqli_fetch_assoc($check1)) {

    $json['username'] = $resultArr['username'];
    $json['id'] = $resultArr['id'];
    $json['first'] = $resultArr['first'];
    $json['middle'] = $resultArr['middle'];
    $json['last'] = $resultArr['last'];

$json['users'] = $json;
}


echo json_encode($json);
}
?>
4

3 に答える 3

2

無関係なデータをフェッチしているため、SQLレベルで結合を使用することはできません。

しかし、JSONは、何をどのようにフィードするかを気にすることはできませんでした。適切なPHPレベルのデータ構造を構築するだけです。

$data = array();
$data['streamdata'] = array();
... insert data from 'streamdata' query...
$data['streamdata_comments'] = array();
... insert comment data ...
$data['users'] = array();
... insert user data ...

これにより、各クエリからのデータを含む3方向配列が得られます。次に、その構造全体$dataをjson_encodeに渡し、ブームします。SQL結合に触れることなく、単一のデータ構造に3つの未評価のクエリがあります。

于 2012-09-02T21:48:17.833 に答える
0

無関係なデータをフェッチしています。データの結合は、結合するデータに関係がある場合にのみ役立ちます。

リンゴ、牛、猿に参加することはできません。

于 2012-09-02T21:43:27.290 に答える
0

以前の回答のいくつかは、無関係のテーブルを結合できないことを示唆していますが、これらは明らかに無関係のテーブルではありません。およびテーブルは非常に密接に関連しており、streamdataテーブルは他のテーブルのユーザーID値を名前にマップします。streamdata_commentsusers

SQLレベルでは、これらを簡単に組み合わせることができます。

SELECT d.*, c.*, u.*
  FROM streamdata          AS d
  JOIN streamdata_comments AS c ON d.streamitem_ID = c.comment_streamitem
  JOIN users               AS u ON u.user_id = c.comment_poster
 WHERE c.comment_poster = '$following_string'
   AND d.streamitem_id < '$lastID'
   AND (d.streamitem_target  = '$following_string' OR
        d.streamitem_creator = '$following_string');

結果がJSON文字列にラップするのに意味があるかどうかは別の問題であり、私にはわかりません。これにより、各ストリームアイテムに関連付けられた各コメントのコメント情報から1つのレコードが得られます。

于 2012-09-02T22:28:56.220 に答える