2016-05-11 8 views
1

私はユーザーがメモを作成できる場所に取り組んでいます。フェッチで表示中にサブ​​データを取得しますか?

メモには、id、owner_id、およびdataがあります。実際 ページのロードが、私は、ユーザーのすべてのノートを取得し、PHPのループでそれを表示してフェッチするための基本的なSELECTクエリを作る:

$stmt = $conn->prepare("SELECT id, data FROM notes WHERE owner = ?"); 
$stmt->bind_param("s", $_SESSION["id"]); 

[...] 

while($stmt->fetch()){ 
    display_note($note_id, $data); 
} 

ノートテーブルは次のようになります。

Note(id, owner, data) 

私がしようとしているのは、ノートにタグを追加することです。

Tags(id, name) 
Note_tags(note_id, tag_id) 

ユーザーがタグを追加するときに、タグ名がすでにそのタグのIDを取得するか、代わりにそれを作成し、作成した新しいを取り戻す存在するのであれば、私のPHPコードに見える2つの追加のテーブルを作成したことを行うために、タグID。

次に、note_tagsテーブルにメモIDとタグIDを含むエントリを追加します。

問題は、フェッチループでメモを表示するときに、メモのすべてのタグを取得する方法がわかりません。

私はメモごとにSELECTクエリを実行する必要があると思っていましたが、これは最善の解決策ではないと思います。たとえば、ユーザーが100音以上の音を持っている場合、100の質問を作成するのは良い考えですか?

これはもっと良い解決策ではないので、PHPでネストされたクエリを実行する方法は?

ありがとうございました。

答えて

1

多次元配列を作成する必要があります。

まず、すべてのノートとタグを取得:

[ 
    { 
     "data":"The content of a note", 
     "tags": [ 
      "the name of a tag", 
      "the name of an other tag" 
     ] 
    }, 
    { 
     "data":"The content of an other note", 
     "tags": [ 
      "the name of a tag", 
      "the name of an other tag" 
     ] 
    } 
] 

SELECT notes.id, data, tag_id, tags.name AS tag_name 
FROM notes 
LEFT JOIN note_tags ON note_id = tag_id 
LEFT JOIN tags ON tags.id = tag_id 
WHERE owner = ? 

はその後今、あなたはこのようになります配列を持つべきである配列

$data = array(); 
while($row = $stmt->fetch()){ 
    $data[$row["id"]]["data"] = $row["data"]; 
    $data[$row["id"]]["tags"][$row["tag_id"]] = $row["tag_name"]; 
} 

を構築するために、結果を反復処理します

関連する問題