我正在处理一个稍微复杂的(至少对我来说)包含子查询的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
)匹配的所有元素。
我哪里做错了?
5条答案
按热度按时间62o28rlo1#
我不确定是否可以返回这样的子查询,一个解决方案是在子查询中使用
GROUP_CONCAT
将所有值连接成一个字符串,然后在结果中使用explode
将该字符串拆分成一个数组。更新:子查询只能匹配1行
来源:http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html
w41d8nur2#
提供了一个表,其中每个pv.值对应一行(顺便说一句,不建议使用'value'等保留字)。通过www.example.com对输出进行排序p.id可确保特定产品的所有行都在一起。因此,在应用程序层中,循环遍历各行,每次p.id更改时都更改product。
我给出的结构可能比您要求的结构更灵活,因为它允许您通过数组键访问特定的产品。
stszievb3#
我认为'values'属性将永远是一个变量。考虑纯SQL,不管PHP -如果你在你的SQL编辑器中运行这样的查询-你会得到一个列的values属性。如果你要求检索多个列,你会得到一个错误。
通常,SQL查询总是平面的-一个级别。
我的建议-运行2个查询,并把它们放在一起的PHP层。
nqwrtyyt4#
MySQL只能返回一个二维的结果集,不能返回更复杂的数据结构。你必须做两个独立的查询,然后在你的应用程序中连接一个结果。
PHP中的示例:
根据GolezTrol的回答,我们可以得到一个更优雅的变体:
祝你好运!
d4so4syb5#
当我搜索“mysql 5. 7 subquery into array”时,这是最常见的结果,所以尽管这个问题很老,但它可以帮助其他人提到,自MySQL 5. 7. 22以来,一个可能的解决方案是使用聚合函数
JSON_ARRAYAGG()
,尽管使用JOIN
而不是子查询。银Light给出的示例的修改:
https://dev.mysql.com/doc/refman/5.7/en/aggregate-functions.html#function_json-arrayagg