我必须选择一个计数列,按来自两个来源的日期分组。我将结果集连接为一个子查询。然而,结果是假的。我认为这个问题与JOIN .. ON子句有关。这个查询运行得很好:
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?现在是“未知列”。
发布于 2012-01-23 00:40:48
在您的子查询中,您将使用诸如SELECT的pd.pid之类的列,这些列不是GROUP BY的一部分,也不是聚合的。这样的列被称为hidden,在标准SQL中这会导致语法错误,但是mysql允许这样做,尽管它可以自由地从每个组中的任何行中选择值。
如果你用WHERE pd.pid = 111限制你的集合,那么组中pd.pid的所有值都是相同的,所以用哪一行来获取它并不重要,但是如果没有WHERE,pd.pid的值将是未定义的(mysql可能会选择能最快获取它的那个)。您还将这个未定义的pid用于连接,因此必然会得到错误的结果。
http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html
然而,很难说你应该如何重写你的查询,因为你没有提供足够的关于表模式的信息,你试图实现的是什么,你的表/列名的含义是什么。
https://stackoverflow.com/questions/8962237
复制相似问题