首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有联接的子查询的列范围

问具有联接的子查询的列范围
EN

Stack Overflow用户
提问于 2012-01-22 23:38:41
回答 1查看 884关注 0票数 0

我必须选择一个计数列,按来自两个来源的日期分组。我将结果集连接为一个子查询。然而,结果是假的。我认为这个问题与JOIN .. ON子句有关。这个查询运行得很好:

代码语言:javascript
复制
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子句)返回一个错误的结果集:

代码语言:javascript
复制
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?现在是“未知列”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8962237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档