2012-12-26 36 views
1

我是新来的php。我无法弄清楚如何查询我的数据库列出这个样机。对于每个数组,我想查询数据库以仅列出与''中左侧相关的内容。 我的数据库包含2个表格。mysql查询到数组

表1 =专辑

ID,名称

表2 =图片

ID,专辑,picPath

$q_albums = array(

      'People' => array(
         ALBUM_PATH.'4.jpg', 
         ALBUM_PATH.'11.jpg', 
         ALBUM_PATH.'10.jpg'),    
      'Nature' => array(
         ALBUM_PATH.'2.jpg', 
         ALBUM_PATH.'3.jpg', 
         ALBUM_PATH.'5.jpg', 
         ALBUM_PATH.'6.jpg', 
         ALBUM_PATH.'7.jpg'),        
      'Art' => array(
         ALBUM_PATH.'1.jpg', 
         ALBUM_PATH.'8.jpg', 
         ALBUM_PATH.'9.jpg', 
         ALBUM_PATH.'2.jpg'),     
      'Wilderness' => array(
         ALBUM_PATH.'3.jpg', 
         ALBUM_PATH.'2.jpg', 
         ALBUM_PATH.'5.jpg', 
         ALBUM_PATH.'7.jpg', 
         ALBUM_PATH.'6.jpg'),        
      'Photography' => array(
         ALBUM_PATH.'8.jpg', 
         ALBUM_PATH.'1.jpg', 
         ALBUM_PATH.'9.jpg', 
         ALBUM_PATH.'12.jpg'),       
      'Fashion' => array(
         ALBUM_PATH.'11.jpg', 
         ALBUM_PATH.'4.jpg', 
         ALBUM_PATH.'10.jpg'), 

     ); 
+0

请注意,mysql只能返回2d数组,因此您需要获取所有需要的数据,然后在php中构建这样的结构。 –

回答

1

由于开发无效居民的笔记,你需要建立来自查询的数组产生循环。幸运的是,这是很容易:

$sql = <<<END 
    SELECT album.name AS albumName, picture.picPath AS picPath 
    FROM album JOIN picture ON album.id = picture.album 
END; 

$res = $mysqli->query($sql); 
$q_albums = array(); 
while ($row = $res->fetch_object()) { 
    // this line actually build the array, entry by entry: 
    $q_albums[ $row->albumName ][] = $row->picPath; 
} 
$res->close(); 

编辑:激进先生所指出的,如果你想你的结果,包括空相册,你应该JOIN更改为LEFT JOIN。如果你这样做,查询将返回一个空行picPath的行,所以你必须以某种方式处理这些空路径。一种方法是,包括类似下面的代码建立后阵:

foreach ($q_albums as $album => &$pics) { 
    // remove dummy null entries from empty albums 
    if (!isset($pics[0])) array_shift($pics); 
} 
+0

谢谢illmari的片段。做了一些调整,并让它工作。 – ducsu

1

@Ilmari Karonen我会用LEFT JOIN的代替JOINSELECT album.name AS albumName, picture.picPath AS picPath FROM album LEFT JOIN picture ON album.id = picture.album

+0

如果您想在将来扩展数据库,我想推荐使用一个数字作为您的相册的ID值。查询数字值与字符串值相比更快。此外,你不太可能犯错误。例如,如果一张专辑被称为“专辑中的人物”,并且名称是图片中的人物,您可能会遇到麻烦。 –

+0

感谢您的提示。我会牢记这一点。 – ducsu

+0

如果OP想要结果包含空白专辑,那么你是对的,他们应该使用'LEFT JOIN'。然后,他们还必须调整其代码以忽略数据中的任何空图像路径(在构建数组或处理数据时)。 –