mySQL:数组的子查询?
我正在处理一个稍微复杂(至少对我来说)的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 当前
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'];
}