2012-01-19 35 views
0

我在PHP中運行以下代碼以從數據庫生成隨機電影列表,但由於genere的值是一個數組,它只是捕獲數組的第一個值。PHP MYSQL數組

如何修改查詢,以便我可以在逗號分隔的行中獲取genere的所有值。

 $q = "SELECT * 
      FROM 
       title 
       INNER JOIN title_genere ON (title.id = title_genere.id_title) 
       INNER JOIN genere ON (title_genere.id_genere = genere.id) 
      ORDER BY RAND() 
      LIMIT 8"; 

$result = mysql_query($q); 
while ($row = mysql_fetch_array($result)) { 

    $id = $row['id']; 
    $title = $row['title']; 
    $year = $row['year']; 
    $poster = $row['poster']; 
    $poster = str_replace("./", "lib/", $poster); 
    $genere = $row['genere']; 

    echo "<div id='a'>"; 
    echo "<div id='b'>".$title.'</div>'; 
    echo "<div id='c'>".$year.'</div>'; 
    echo "<div id='d'><a href='select.php?movieid=$id'><img src='$poster' alt='' border='1' align='center' width='214' height='314' /></a></div>"; 
    echo "<div id='e'>".$genere.'</div>'; 
    echo "</div>"; 
    //var_dump($genere); 
} 
+4

考慮使用MySQL的[GROUP_CONCAT()](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat )功能。 –

回答

4

試試這個:

$q = "SELECT 
      *, 
      GROUP_CONCAT(CAST(title_genere AS BINARY) SEPARATOR ',') AS generes 
     FROM 
      title 
      INNER JOIN title_genere ON (title.id = title_genere.id_title) 
      INNER JOIN genere ON (title_genere.id_genere = genere.id) 
     ORDER BY RAND() 
     GROUP BY title.id 
     LIMIT 8"; 

這應該選擇在generes一個逗號分隔的列表進入關鍵generes。欲瞭解更多信息,請參閱手冊http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

+0

爲什麼他應該使用'CAST ... AS BINARY'? – kuboslav

+0

@kuboslav我從我的一個項目中獲取了代碼,很久以前我就在互聯網上找到了它。 'GROUP_CONCAT(title_genere SEPARATOR',')AS生成是否正確? – TimWolla

+0

我想這會更好 - 'CAST'是不必要的。 – kuboslav

0

不要使用GROUP_CONCAT/GROUP BY,它會導致開銷。

首先,將您的8個隨機標題(僅限titles表)選擇到由標題id索引的關聯數組中。我們將其命名爲$ idx。

接下來,準備ID列表,比如說,$ ids變量。

然後,運行查詢列表中的

SELECT 
title_genere.id_title 
, genre.genre 
FROM 
title_genre 
INNER JOIN genre ON title_genere.id_genere = genere.id 
WHERE 
title_genere.id_title IN ($ids) 
ORDER BY 
genre 

和收穫genre$idx

$idx[$row['id_title']]['genres'][] = $row['genre'] 

最後,產生從$ IDX HTML。

0

排序。我使用下面的代碼來生成我想要的。感謝大家的幫助

SELECT 
     title.id, 
     title.title, 
     GROUP_CONCAT(genere SEPARATOR ' | ') AS genere, 
     title.`year`, 
     title.poster 
    FROM 
     title 
     INNER JOIN title_genere ON (title.id = title_genere.id_title) 
     INNER JOIN genere ON (title_genere.id_genere = genere.id) 
    GROUP BY 
     title.id, 
     title.title, 
     title.`year`, 
     title.poster 
    ORDER BY 
     RAND() 
    LIMIT 8