Mysql 具有联接子查询的列范围

Mysql 具有联接子查询的列范围,mysql,join,subquery,Mysql,Join,Subquery,我必须选择一个计数列,按两个来源的日期分组。我将作为子查询加入结果集。然而,结果是假的。如我所见,问题与连接有关。。关于子句。此查询工作正常: SELECT id FROM pu a LEFT JOIN ( SELECT COUNT(pd.id) AS c_id1, NULL AS c_id2, LEFT(pd.start_date, 10) AS date, pd.pid FROM p_d

我必须选择一个计数列,按两个来源的日期分组。我将作为子查询加入结果集。然而,结果是假的。如我所见,问题与
连接有关。。关于
子句。此查询工作正常:

SELECT id
FROM pu a 
LEFT JOIN (
    SELECT 
        COUNT(pd.id) AS c_id1, 
        NULL AS c_id2,
        LEFT(pd.start_date, 10) AS date,
        pd.pid 
    FROM 
        p_d pd
    **WHERE pd.pid = 111**
    GROUP BY date

    UNION 

    SELECT 
        NULL AS c_id1,
        COUNT(pd.id) AS c_id2,
        LEFT(pd.inactivation_date, 10) AS date, 
        pd.pid
    FROM 
        p_d pd
    **WHERE pd.pid = 111**
    GROUP BY date
) x
ON x.pid = a.id;
但是这个(没有
WHERE
子句)返回一个错误的结果集:

SELECT id
FROM pu a 
LEFT JOIN (
    SELECT 
        COUNT(pd.id) AS c_id1, 
        NULL AS c_id2,
        LEFT(pd.start_date, 10) AS date,
        pd.pid 
    FROM 
        p_d pd
    GROUP BY date

    UNION 

    SELECT 
        NULL AS c_id1,
        COUNT(pd.id) AS c_id2,
        LEFT(pd.inactivation_date, 10) AS date, 
        pd.pid
    FROM 
        p_d pd
    GROUP BY date
) x
ON x.pid = a.id;

是否可以在连接的子查询中使用
a.id
?现在是“未知列”。

在子查询中,您正在使用
pd.pid
等列作为
SELECT
,这些列不属于
groupby
的一部分,也不聚合。这样的列被称为
hidden
,在标准SQL中,这会导致语法错误,但mysql允许这样做,尽管它可以从每个组的任何行中自由选择值

如果您使用
限制设置,其中pd.pid=111
组中pd.pid的所有值都是相同的,因此使用哪一行来获取它并不重要,但是如果没有
,则pd.pid的值将是未定义的(mysql可能会选择最快的一行)。您还将该未定义的pid用于联接,因此必然会得到错误的结果


然而,很难说您应该如何重写查询,因为您没有提供足够的关于表模式的信息,您试图实现什么以及表/列名的含义是什么。

在子查询中,您正在为
选择不属于
分组依据的且未聚合的
列,如
pd.pid
。这样的列被称为
hidden
,在标准SQL中,这会导致语法错误,但mysql允许这样做,尽管它可以从每个组的任何行中自由选择值

如果您使用
限制设置,其中pd.pid=111
组中pd.pid的所有值都是相同的,因此使用哪一行来获取它并不重要,但是如果没有
,则pd.pid的值将是未定义的(mysql可能会选择最快的一行)。您还将该未定义的pid用于联接,因此必然会得到错误的结果


但是,很难说您应该如何重写查询,因为您没有提供足够的关于表架构的信息,您试图实现什么,表/列名的含义是什么。

后一个结果有什么问题?第二个查询只返回前3-4行(日期)和假数字。第一个返回所有具有正确计数的行(在本例中为~80行)。后一个结果有什么问题?第二个查询只返回前3-4行(日期)和假数字。第一个方法返回所有行(在本例中为~80行)并进行适当计数。这个答案启发了我,我的整个方法都很糟糕。刚刚完成了查询修改,谢谢。这个答案启发了我,我的整个方法都不好。刚刚完成查询修改,谢谢。