Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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_Sql - Fatal编程技术网

Mysql 嵌套子查询中的表别名未知

Mysql 嵌套子查询中的表别名未知,mysql,sql,Mysql,Sql,下面的查询工作正常。我使用外部选择中的值在内部选择中进行过滤 SELECT bk.ID, (SELECT COUNT(*) FROM guests WHERE BookingID = bk.ID) as count FROM bookings bk; 但是,以下选择将不起作用: SELECT bk.ID, (SELECT SUM(count) FROM (SELECT COUNT(*) AS count FROM guests WHERE Booking

下面的查询工作正常。我使用外部选择中的值在内部选择中进行过滤

SELECT
    bk.ID,
    (SELECT COUNT(*) FROM guests WHERE BookingID = bk.ID) as count
FROM
    bookings bk;
但是,以下选择将不起作用:

SELECT
    bk.ID,
    (SELECT SUM(count) FROM (SELECT COUNT(*) AS count FROM guests WHERE BookingID = bk.ID GROUP BY RoomID) sub) as sumcount
FROM
    bookings bk;
错误消息是:
错误代码:1054。“where子句”中的未知列“bk.ID”

为什么我的别名
bk
在subselect中已知,但在subselect的subselect中不知道


作为记录,我使用的是MySQL 5.6。

选择列表中的相关标量子查询通常可以重写为派生表上的左联接(在许多情况下,它们的性能可能会更好):

这称为“范围界定”。我知道Oracle(例如)只关注一个级别来解析表别名。SQLServer也是一致的:它可以查看多个级别

基于这个示例,MySQL明确地将标识符
bk
的范围限制为立即子查询。(我的重点)中有一个小提示:

相关子查询是包含对 也出现在外部查询中的表

但是,我在文档中没有找到任何其他关于范围规则的具体参考。还有其他答案(和)指定表别名的范围仅限于一级子查询


您已经知道如何解决这个问题(您的两个查询应该产生相同的结果)。将查询重新安排为具有联接和聚合也可以解决此问题。

第二个查询的逻辑是什么-您希望为每个
RoomID
生成单独的计数,但随后丢弃所有房间信息并将它们相加?您能添加一些示例数据和预期结果吗?这是一个非常简化的示例,是一个非常大和非常复杂的数据方案的一部分。简单地说,最里面的select应该按天计算发生次数,而sum select应该每月汇总发生次数。是的,这听起来确实是多余的,但遗憾的是,事实并非如此。必须这样做。然而,我并不是在寻找一种不同的方法,我想知道为什么内部select突然不再从外部select识别别名。我怀疑这是一个问题,它在
from
子句中定义的子选择中使用,而不是在
where
子句中引用它。但不是100%确定。标准SQL根本不允许关联到派生表中。您必须使用到派生表的左联接重写它。在第一个选择中,您得到了一个相关的标量子查询,但在第二个选择中,标量子查询中有派生表
FROM(这是一个派生表)子
SELECT
    bk.ID,
    dt.sumcount
FROM
    bookings bk
LEFT JOIN 
 (SELECT BookingID,SUM(COUNT) AS sumcount
  FROM
   (
     SELECT BookingID, RoomId, COUNT(*) AS COUNT 
     FROM guests 
     GROUP BY BookingID, RoomID
    ) sub
  ) AS dt
ON bk.BookingID = dt.BookingID