Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么这个子查询不能返回多行?_Mysql_Django_Database_Subquery_Django Orm - Fatal编程技术网

Mysql 为什么这个子查询不能返回多行?

Mysql 为什么这个子查询不能返回多行?,mysql,django,database,subquery,django-orm,Mysql,Django,Database,Subquery,Django Orm,此查询由Django ORM使用RawSQL生成: SELECT `productos`.`codigo_barras`, ( SELECT articulos.costo_us * (1 + articulos.iva_coef) FROM articulos INNER JOIN ( SELECT articulos.id,

此查询由Django ORM使用RawSQL生成:

SELECT `productos`.`codigo_barras`, (
        SELECT
            articulos.costo_us * (1 + articulos.iva_coef)
        FROM
            articulos
        INNER JOIN (
                SELECT 
                    articulos.id, MAX(encargosProveedor.fecha_entrega)
                FROM
                    articulos, encargosProveedor_listado_articulos, encargosProveedor, itemArticulosProveedor
                WHERE
                    articulos.id = itemArticulosProveedor.articulos_id AND
                    encargosProveedor.id = encargosProveedor_listado_articulos.encargosproveedor_id
                GROUP BY
                    articulos.producto_id
            )
        AS ultimos ON articulos.id = ultimos.id
) AS `ultimo_precio` FROM `productos`
这是一个错误

1242-子查询返回超过1行

这是子查询的结果

我阅读了MYSQL文档,但我不明白为什么返回两行会有问题。我试过很多选择


问题在哪里

包含在SELECT语句列中的子查询称为标量子查询。标量子查询应该只能生成零行或一行,因为它的值标量将被放置在查询结果集的返回行中,其中只有一个值的空间。因此,如果子查询返回的行多于一行,则不能将其直接用作SELECT列

一个选项是强制它最多生成一行,可以使用聚合函数,如MAX、MIN、COUNT等


另一种选择是将子查询作为表表达式联接,其中对返回的行数没有限制。

注释太长

这不是问题

SELECT articulos.id, MAX(encargosProveedor.fecha_entrega) 
FROM ...
子查询这就是问题所在。因为它是联接表达式的一部分,所以允许它返回多行。但是,由于它返回多行,因此周围的子查询:

SELECT articulos.costo_us * (1 + articulos.iva_coef)
FROM articulos
INNER JOIN (SELECT articulos.id, MAX(encargosProveedor.fecha_entrega)
            FROM ...)
还将返回多行


您需要找到一种方法来防止外部子查询返回多行,即使内部子查询返回多行,也可以使用聚合函数,例如MIN或MAX。或者,您需要找到一种方法来区分内部子查询中具有相同MAXENCARGOSPROVEDEOR.fecha_entrega值的行,可能是按另一个限制为1的值排序,以便查询只返回一行。

这与您的问题相同:您需要将外部查询中的行与内部查询中的行关联,例如,通过articulos.producto_id=productos.id,或通过连接中间查询:。。。从productos内部联接选择。。。作为ultimo\u precio.producto\u id=productos.id上的ultimo\u precio。显然,您还需要将producto_id从最里面的查询公开到中间的查询。谢谢Endre。是的,在阅读了回复和更多文档后,我发现了相关子查询的概念,并最终对此查询进行了适当的更改。对于有类似问题的查询,我发现一条非常有用的文章是:@Hernan如果你找到了此问题的解决方案,你应该将其作为答案发布并接受它。
SELECT articulos.costo_us * (1 + articulos.iva_coef)
FROM articulos
INNER JOIN (SELECT articulos.id, MAX(encargosProveedor.fecha_entrega)
            FROM ...)