mySQL:子查询到数组?

wko9yo5t  于 2022-12-17  发布在  Mysql
关注(0)|答案(5)|浏览(150)

我正在处理一个稍微复杂的(至少对我来说)包含子查询的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)匹配的所有元素。
我哪里做错了?

62o28rlo

62o28rlo1#

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

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

来源:http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html

w41d8nur

w41d8nur2#

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'等保留字)。通过www.example.com对输出进行排序p.id可确保特定产品的所有行都在一起。因此,在应用程序层中,循环遍历各行,每次p.id更改时都更改product。

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

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

stszievb

stszievb3#

我认为'values'属性将永远是一个变量。考虑纯SQL,不管PHP -如果你在你的SQL编辑器中运行这样的查询-你会得到一个列的values属性。如果你要求检索多个列,你会得到一个错误。
通常,SQL查询总是平面的-一个级别。
我的建议-运行2个查询,并把它们放在一起的PHP层。

nqwrtyyt

nqwrtyyt4#

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

祝你好运!

d4so4syb

d4so4syb5#

当我搜索“mysql 5. 7 subquery into array”时,这是最常见的结果,所以尽管这个问题很老,但它可以帮助其他人提到,自MySQL 5. 7. 22以来,一个可能的解决方案是使用聚合函数JSON_ARRAYAGG(),尽管使用JOIN而不是子查询。
银Light给出的示例的修改:

SELECT `products`.`id`, JSON_ARRAYAGG(`productValues`.`value`) AS `values` 
FROM `products`, `productValues`
WHERE`product`.`active` = 1 AND `productValues`.`product` = `products`.`id`
GROUP BY `products`.`id`"

https://dev.mysql.com/doc/refman/5.7/en/aggregate-functions.html#function_json-arrayagg

相关问题