我正在研究一个包含子查询的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
)。
我做错了什么?
答案 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)
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']);
}
?>
祝你好运!