从查询中返回多个数组

时间:2010-08-14 17:56:11

标签: php mysql arrays

我有2张桌子

名为services的第一个表有id_service,名称,日期。描述 名为services_images的第二个表有id_img,img_name,id_service

现在假设我必须通过一个查询(如果可能)返回2个数组

第一个数组,其中包含来自表"services"的一个特定ID的字段 第二个数组,其中包含与表"services_images"

中“服务”中所选ID相关的所有图像中的字段

或者更好的是,只有一个数组具有与1中所述相同的数据,其中一个数组INSIDE称为“images”,其中包含表"services_images"

中列出的所有图像

我需要这个来处理和显示html页面中的数据,这是唯一的方法。

如果我不能在mysql中做到如何在PHP中安排它,我唯一能想到的就是2个查询

另外,我总是试图提高自己的技能,因为我曾经对所有内容进行单一查询,是否存在进行1次查询的情况,这是不可能的? 谢谢!

2 个答案:

答案 0 :(得分:1)

编辑:我明白你的意思了 - 我第一次误解了。

执行此操作的唯一方法是执行多个查询。你必须做类似的事情:

$sql = "SELECT * FROM services WHERE id_service=$id";
$result = mysql_query($sql);
$services = mysql_fetch_array($result);

$new_sql = "SELECT * FROM services_images WHERE id_service=$id";
$new_result = mysql_query($sql);
while($row = mysql_fetch_array($result)){
     $serivices_images[] = $row;
}

实际上我再次改变主意..试试这个:

SELECT services.*,services_images.* FROM services, services_images WHERE services.id_service=services_images.id_service AND services.id_service=$id

现在当你执行while($row = mysql_fetch_array($sql_query_result))时,你可能会返回所有行...但我不知道。只是一个猜测。

答案 1 :(得分:0)

与PDO一起使用:

$db = new PDO($dsn, $user, $pass);

$sql = 'SELECT services.id_service, services.name, services.date, services.description, services_images.id_image, services_images.img_name
FROM services, services_images
WHERE services.id_service = services_images.id_service
ORDER BY services.id_service';

$services = array();

foreach($db->query($sql) as $row)
{
   $serviceId = $row['id_service'];

   if(!array_key_exists($serviceId, $services))
   {
      $services[$serviceId] = array(
          'name' => $row['name'],
          'date' => $row['date'],
          'description' => $row['description'],
          'services_images' => array()
      );
   }

   $imgId = $row['id_img'];
   $services[$serviceId]['services_images'][$imgId] => array(
      'id_image' => $imgId,
      'img_name' => $row['img_name']
   ); 
}

print_r($services);

请注意..如果您加入的两个表(在本例中为servicesservices_images)具有任何具有相同名称的列,您将只获取该行中检索到的最后一个列的值除非你将它们别名或从select语句中排除它们。

此外,如果结果的大小很大,您可能必须使用两个类似于Thomas建议的查询,因为您可能没有足够的内存来保存完整的数组结构。