2012-04-10 73 views
4

對不起英文不好和壞標題!MySQL從3個表中選擇,並把它放在PHP數組中

我有表 「後」

id title 
1  test Thread 
2  hello 
3  just 

所以有「標籤」

tagid tagname 
1  test 
2  russia 
3  new site 

所以有post_tags

tagid postid 
1  1 
2  1 
3  1 

我需要從一個數組下面的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 2012-04-10 21:38:14

+1

僅供參考:如果您使用保留字,則只需要轉義表/字段名稱。將所有內容倒入反引號只會使查詢更加難以閱讀。 – 2012-04-10 21:45:40

回答

2

查詢很好。你只需要一些邏輯在你的循環:

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行,然後你從當前行要的是標籤名(所以它添加到「標籤」陣列)。如果這是第一次看到這個帖子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"]); 
} 

我不能對它進行調試,所以告訴我,如果你得到任何錯誤

2

你不能得到一個多維數組從一個MySQL數據庫回來。如果您需要這種形式,您必須對結果進行自己的後處理。這樣的事情可能嗎?

$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']; 
} 
相關問題