2013-05-12 73 views
3

我有3个表,其中一个用来存储项目的一般属性。每个项目可以获得一个或多个图像和一个或多个地址,我将它们存储在单独的表格中。PHP mySQL一对多以数组形式获得结果

tbl_items

id title 
1  item1 
2  item2 

tbl_item_imgs

id title filename item_id 
1 img1 kfm.gif 1 
2 img2 edff.png 1 
3 img3 knkk.jpg 2 
4 img4 lkj.png 1 

tbl_item_addresses

id address  attitude longitude item_id 
1 texas  55   54   1 
2 NY   34   34   1 
3 texas  55   53.5  1 
4 LA   84   85   2 

现在我想获得一个数组或对象作为这样的结果:

array(2){ 

    [0]=> array(4){ 
      [id]=>"1" 
      [title]=>"item1" 
      [imgs] => array(3){ 
       [0]=> array(4){ 
        [id] => "1" 
        [title] => "img1" 
        [filename] => "kfm.gif" 
        [item_id] => "1" 
       } 
       [1]=> array(4){ 
        [id] => "2" 
        [title] => "img2" 
        [filename] => "edff.png" 
        [item_id] => "1" 
       } 
       [2]=> array(4){ 
        [id] => "4" 
        [title] => "img" 
        [filename] => "lkj.png" 
        [item_id] => "1" 
       } 
      } 
      [addresses] = array(3){ 
       [0]=> array(4){ 
        [id] => "1" 
        [address] => "texas" 
        [attitude] => "55" 
        [longitude] => "54" 
       } 
       [1]=> array(4){ 
        [id] => "2" 
        [address] => "NY" 
        [attitude] => "34" 
        [longitude] => "34" 
       } 
       [2]=> array(4){ 
        [id] => "3" 
        [address] => "texas" 
        [attitude] => "55" 
        [longitude] => "53.5" 
       } 
      }   
    } 

    [1]=> array(4){ 
     array(4){ 
      [id]=>"1" 
      [title]=>"item1" 
      [imgs] => array(1){ 
       [0]=>array(4){ 
        [id] => "3" 
        [title] => "img3" 
        [filename] => "knkk.jpg" 
        [item_id] => "2" 
       }  
      } 
      [addresses] = array(1){ 
       [0]=>array(4){ 
        [id] => "4" 
        [address] => "LA" 
        [attitude] => "84" 
        [longitude] => "85" 
       } 
      } 
     } 
    } 

} 

所以,我的问题是这样的:我可以通过一个SQL请求来做到这一点?我知道,MySQL不会返回数组,所以我必须使用PHP来处理mysql结果来获取它。请帮我找出最好的方法来做到这一点。

一种方式可能是通过一个查询获取项目并对其进行foreach,然后使用单独的sql请求获取每行的地址和imgs,并将它们推送到项目数组中。我不认为这是一个好主意,因为这需要太多的查询,而且会很慢。

+0

我不确定你在问什么:如果你可以用一个SQL查询(如果是这样,查询是什么)提取所有数据,或者你如何从数组中提取数据数据。 – 2014-03-06 13:20:47

+1

我会使用两个连接从数据库中获取数据。然后我会使用一个带有item id的foreach作为父数组的键,我会通过循环将地址数据和img数据推送到数组中。 – 2014-03-06 13:40:28

+0

@MartinE。谨慎给OP一些代码? – 2014-03-06 14:51:23

回答

0
<?php 
     $current_title = ''; 
     $data_array = array(); 
     $query = "SELECT tbl_items.*, imgs.id AS image_id,imgs.title AS image_title,imgs.filename AS image_filename,imgs.item_id AS image_itemid , addresses.item_id AS address_itemid, addresses.id AS address_id 
     , addresses.attitude AS address_attitude, addresses.longitude AS address_longitude 
      FROM tbl_items 
      LEFT JOIN tbl_items_addresses AS addresses ON tbl_items.id = addresses.item_id 
      LEFT JOIN tbl_item_imgs AS imgs ON tbl_items.id = imgs.item_id"; 
     $data_results = mysql_query($query); 
     foreach ($data_results as $data){ 
      if ($data['title'] != $current_title){ 
       $current_title = $data['title']; 
       $data_array[$current_title]['id'] = $data['id']; 
       $data_array[$current_title]['title'] = $data['title']; 
       $data_array[$current_title]['addresses'] = array(); 
       $data_array[$current_title]['imgs'] = array(); 
      } 
       $data_array[$current_title]['addresses'][] = ('address_id'=>$data['address_id'],'address_itemid'=>$data['address_itemid'],'address_attitude'=>$data['address_attitude'],'address_longitude'=>$data['address_longitude']); 
       $data_array[$current_title]['imgs'][] = ('image_id'=>$data['image_id'],'image_title'=>$data['image_title'],'image_filename'=>$data['image_filename'],'image_itemid'=>$data['image_itemid']); 
     } 
    ?> 
+0

你去@Nigel Nquande :)有可能有更好的方法来做到这一点,但那就是我该怎么做! – 2014-03-06 16:02:07