2012-04-10 4 views
4

Sorry für schlechtes Englisch und schlechten Titel!MySQL Wählen Sie aus 3 Tabellen und setzen Sie das in PHP-Array

Ich habe den Tisch "post"

id title 
1  test Thread 
2  hello 
3  just 

so "Tags" haben

tagid tagname 
1  test 
2  russia 
3  new site 

haben so ein post_tags

tagid postid 
1  1 
2  1 
3  1 

Ich brauche eine Reihe von var_dump weiter unten:

$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 
    ), 
) 

Ich versuche es, aber ich bekomme nicht das, was ich will.

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` 

ich in SQL nächste folgende bekommen:

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); 

Thank you !!!

+0

Sie können eine mehrdimensionale Arrays nicht aus einer MySQL-Datenbank abrufen. Sie müssen Ihre eigenen Nachbearbeitung zu den Ergebnissen machen, wenn Sie es in diesem Formular möchten. – dqhendricks

+1

FYI: Ausschließende Tabelle/Feldnamen ist nur erforderlich, wenn Sie reservierte Wörter verwenden. Dump alles in Backticks macht nur die Abfrage, die viel schwieriger zu lesen. –

Antwort

2

Die Abfrage ist in Ordnung. Sie müssen nur eine gewisse Logik in der Schleife:

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']) 
     ); 
    } 
} 

Wenn Sie bereits eine Reihe mit der gleichen Post-ID gesehen haben dann alle wollen Sie aus der aktuellen Zeile ist der Tag-Namen (so diese ergänzen die „Tags“ Array). Wenn es das erste Mal ist, dass eine Zeile mit dieser Post-ID angezeigt wird, fügen Sie sie einfach zu $posts hinzu, wobei Sie vorsichtig sein müssen, um "Tags" entweder auf null oder ein Array mit einem Element zu setzen.

1

Try this:

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"]); 
} 

ich es nicht debuggen können, so mir sagen, wenn Sie Fehler bekommen

2

Sie können eine mehrdimensionale Arrays zurück aus einer MySQL-Datenbank erhalten. Sie müssen Ihre eigenen Nachbearbeitung zu den Ergebnissen machen, wenn Sie es in diesem Formular möchten. So etwas vielleicht?

$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']; 
} 
Verwandte Themen