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行)并进行适当计数。这个答案启发了我,我的整个方法都很糟糕。刚刚完成了查询修改,谢谢。这个答案启发了我,我的整个方法都不好。刚刚完成查询修改,谢谢。