mySQL:子查询到数组?

时间:2010-12-01 14:22:42

标签: mysql subquery

我正在研究一个包含子查询的mySQL查询的一个轻微的复杂(至少对我而言),并不诚实。

SELECT `products`.`id`, `product`.`price`, 
  ( SELECT `value` FROM (`productValues`) 
    WHERE `productValues`.`product` = 'product.id'
  ) as values 
FROM (`products`) WHERE`product`.`active` = 1

目前的结果如下:

Array
(
    [0] => Array
        (
            [id] => 1
            [active] => 1
            [price] => 1000
            [values] => 
        )
)

我想要的是values元素也成为一个数组,其中Values表中的所有元素都匹配(WHERE productValues.product = product.id)。

我做错了什么?

4 个答案:

答案 0 :(得分:7)

我不确定你是否可以像这样返回子查询。解决方案是在子查询中使用GROUP_CONCAT将所有值连接到字符串。然后,在结果中,您可以使用explode将此字符串拆分为数组。

更新:子查询只能匹配1行
来源:http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html

答案 1 :(得分:4)

SELECT p.id, p.price, pv.`value`
FROM products p
  JOIN  productValues pv
  ON p.product_id=pv.product
WHERE p.active = 1
ORDER BY p.id;

给出一个表,每个pv.value有一行(BTW,不建议使用像'value'这样的保留字)。通过p.id对输出进行排序可确保特定产品的所有行都在一起。因此,在应用程序层中,循环遍历行,每次p.id更改时都会更改产品。

$old_id=NULL;
$datastructure=array();
while($arr=$result->fetch_assoc()){
  if($arr['id']!=$old_id){
    $datastructure[$arr['id']][price]=$arr['price'];
    $old_id=$arr['id'];
  }
  $datastructure[$arr['id']]['values'][]=$arr['value'];
}

我给出的结构可能比您要求的结构更灵活,因为它允许您通过数组键访问特定产品。

答案 2 :(得分:1)

我认为'values'属性将始终是一个变量。想想纯SQL,无论PHP如何 - 如果你在sql编辑器中运行这样的查询 - 你会将values属性作为一列。如果您要求检索多个列,则会出现错误。
通常,SQL查询总是平坦的 - 一个级别 我的建议 - 运行2个查询,并将它们放在PHP层中。

答案 3 :(得分:1)

MySQL只能返回二维结果集,它不能返回更复杂的数据结构。您将必须进行两个单独的查询并在您的应用程序中加入结果。

PHP中的示例:

<?php

//getting a list of products
$result = mysql_query("SELECT `products`.`id`, `product`.`price`
                        FROM (`products`)
                        WHERE`product`.`active` = 1");

$product_ids = array();
$products = array();
while($r = mysql_fetch_assoc($result))
{
    $products[$r['id']] = $r;
    $product_ids[] = $r['id'];
}

$comma_separated_ids = implode(",", $product_ids);

//getting a list of all product values for given products
$result = mysql_query("SELECT `value`, `product`
                        FROM (`productValues`)
                        WHERE `productValues`.`product` IN ('$comma_separated_ids')");

//joining them together
while($r = mysql_fetch_assoc($result))
{
    if (!isset($products[$r['product']]['values']))
        $products[$r['product']]['values'];

    $products[$r['product']]['values'][] = $r['value'];
}

?>

基于GolezTrol答案的更优雅的变体:

<?php
$result = mysql_query("SELECT `products`.`id`, GROUP_CONCAT(`productValues`.`value`) AS `values` 
                        FROM `products`, `productValues`
                        WHERE`product`.`active` = 1 AND `productValues`.`product` = `products`.`id`
                        GROUP BY `products`.`id`");

$products = array();
while($r = mysql_fetch_assoc($result))
{
    $products[$r['id']] = $r;
    $products[$r['id']]['values'] = explode(',', $products[$r['id']]['values']);
}
?>
祝你好运!