mySQL:数组的子查询?

mySQL:数组的子查询?,mysql,subquery,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 当前

我正在处理一个稍微复杂(至少对我来说)的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


我做错了什么?

我不确定您是否可以像这样返回子查询。解决方案是在子查询中使用
GROUP\u CONCAT
将所有值关联到一个字符串。然后,在结果中,您可以使用
explode
将该字符串拆分为一个数组

更新:子查询只能匹配1行

来源:

我认为“值”属性总是一个变量。想想纯SQL,不管PHP如何——如果您在SQL编辑器中运行这样的查询——您将得到作为一列的values属性。如果您要求检索多个列,则会出现错误
一般来说,SQL查询始终是平面的—一级查询。

我的建议-运行2个查询,并将它们放在PHP层中。

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'];
}

?>

给出一个表,每个pv.value对应一行(顺便说一句,不建议使用“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'];
}

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

只有当
GROUP\u CONCAT
保证生成字符串@dnagirl时,这才是一个合理的解决方案-您始终可以增加
GROUP\u CONCAT\u max\u len
。,
group\u concat
很方便。您不必编写代码来迭代结果,因此可以尽早释放mysql结果possible@ajreal:我同意
GROUP\u CONCAT
很方便。但是,即使改变了
组的最大长度,仍然存在一个限制,这个限制可能会咬到你。我有这件T恤来证明这一点@是的,极限永远是一个极限。只是无法抗拒来自团体的诱惑。
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;
$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'];
}