2012-04-10 8 views
4

悪い英語と悪いタイトルを残して申し訳ありません!MySQL 3つのテーブルから選択し、それをPHP配列に入れます

私はそう"タグ"

tagid tagname 
1  test 
2  russia 
3  new site 

はので、私はからの配列が必要post_tags

tagid postid 
1  1 
2  1 
3  1 

を持っているテーブル "ポスト"

id title 
1  test Thread 
2  hello 
3  just 

を持っています次のvar_dump:

$posts = array(
    1 => array(
     'title' => 'test Thread', 
     'tags' => array(
      'test', 'russia', 'new site', 
     ), 
    ), 
    2 => array(
     'title' => 'hello', 
     'tags' => NULL 
    ), 
    3 => array(
     'title' => 'just', 
     'tags' => NULL 
    ), 
) 

私はそれをやっているが、私はそれが私が望むものではない。次の次の

SELECT `post`.`id`, `post`.`title`, `tags`.`tagname` FROM `post` 
LEFT JOIN `post_tags` ON `post_tags`.`tagid` = `post`.`id` 
LEFT JOIN `tags` ON `post_tags`.`tagid` = `tags`.`tagid` 

私はSQLで取得:

id title   tagname 
1 test Thread  test 
1 test Thread  russia 
1 test Thread  newsite 
2 hello   NULL 
3 just   NULL 

PHP

$query = mysql_query("SELECT `post`.`id`, `post`.`title`, `tags`.`tagname` FROM `post` 
    LEFT JOIN `post_tags` ON `post_tags`.`tagid` = `post`.`id` 
    LEFT JOIN `tags` ON `post_tags`.`tagid` = `tags`.`tagid`"); 
$posts = array(); 
while ($row = mysql_fetch_assoc($query)) 
{ 
    $posts[] = $row; 
} 

var_dump($posts); 

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

+0

mysqlデータベースから多次元配列を戻すことはできません。そのフォームに必要な場合は、結果に対して独自の後処理を行う必要があります。 – dqhendricks

+1

FYI:エスケープテーブル/フィールド名は、予約語を使用している場合にのみ必要です。すべてをバッククォートにダンプするだけで、そのクエリーが読みにくくなります。 –

答えて

2

クエリは正常です。すでに同じポストIDを持つ行を見ているなら、あなたは現在の行から必要なすべてのタグ名である

while ($row = mysql_fetch_assoc($query)) 
{ 
    if (isset($posts[$row['id']])) { 
     $posts[$row['id']]['tags'][] = $row['tagname']; 
    } 
    else { 
     $posts[$row['id']] = array(
      'title' => $row['title'], 
      'tags' => $row['tagname'] === null ? null : array($row['tagname']) 
     ); 
    } 
} 

(そう、「タグ」の配列にこれを追加します。あなたは自分のループ内のいくつかのロジックを必要とします)。この投稿IDの行が初めて表示された場合は、$postsに追加してください。ちょっと注意して、「タグ」をnullまたは1つの要素を持つ配列に設定するよう注意してください。

while ($row = mysql_fetch_assoc($query)) 
{ 
    if(!isset($posts[$row["id"]])) { 
     $posts[ $row["id"] ] = array("title" => $row["title"], "tags" => array()); 
    } 
    array_push($posts[ $row["id"] ][ "tags" ], $row["tagname"]); 
} 

が、私はそれをデバッグすることはできませんので、あなたはあなたが戻ってMySQLデータベースから多次元配列を取得することはできません何らかのエラー

1

これを試してみてください。そのフォームに必要な場合は、結果に対して独自の後処理を行う必要があります。このような何か?

$posts = array(); 
while ($row = mysql_fetch_assoc($query)) 
{ 
    if (!isset($posts[$row['id']])) { 
     $posts[$row['id']] = array(); 
     $posts[$row['id']]['title'] = $row['title']; 
     $posts[$row['id']]['tags'] = array(); 
    } 
    if ($row['tagname'] != null) $posts[$row['id']]['tags'][] = $row['tagname']; 
} 
関連する問題