代码之家  ›  专栏  ›  技术社区  ›  soulmerge

在子查询中引用外部查询的表

  •  41
  • soulmerge  · 技术社区  · 14 年前

    是否可以使用MySQL在子查询中引用外部查询?我知道有 一些 可能的情况:

    SELECT *
    FROM table t1
    WHERE t1.date = (
        SELECT MAX(date)
        FROM table t2
        WHERE t2.id = t1.id
    );
    

    但我想知道这样的事情是否可行:

    SELECT u.username, c._postCount
    FROM User u
    INNER JOIN (
        SELECT p.user, COUNT(*) AS _postCount
        FROM Posting p
        --# This is the reference I would need:
        WHERE p.user = u.id
        GROUP BY p.user
    ) c ON c.user = u.id
    WHERE u.joinDate < '2009-10-10';
    

    我知道我也可以用 GROUP BY 或者拉外侧 WHERE 子查询中的子句,但我需要它来自动生成SQL,并且由于各种其他原因,不能使用这两种方法之一。

    更新 :抱歉,这个问题导致了一些混乱:第一个查询只是一个工作示例,用于演示 不要 需要。

    更新2 :我需要两个u.id=p.user比较:第一个统计“2009-10-10”之前加入的用户,而另一个统计条件是正确关联表行的加入条件。

    4 回复  |  直到 6 年前
        1
  •  17
  •   chris    14 年前

    我认为这行不通,因为您将派生表“c”作为联接的一部分进行引用。

    但是,你可以把 WHERE p.user = u.id 但替换为 GROUP BY p.user 在派生表中,因为 ON c.user = u.id 会有同样的效果。

        2
  •  17
  •   Jeremy    14 年前

    这不是你想要的吗?

    SELECT u.username, c._postCount
    FROM User u
    INNER JOIN (
        SELECT p.user, COUNT(*) AS _postCount
        FROM Posting p
        GROUP BY p.user    
    ) c ON c.user = u.id
    WHERE u.joinDate < '2009-10-10';
    

    这将起作用的原因是联接本身的性质将根据用户进行过滤。您不需要有一个WHERE子句明确地过滤用户。

        3
  •  0
  •   DRapp    14 年前

    非常接近…

    WHERE t1.date = ( 
        SELECT MAX(date) 
    

    改为

    WHERE t1.date IN ( 
        SELECT MAX(date) 
    

    因为您的查询执行max(),所以它总是只返回一个日期…因为您的子选择具有唯一ID上的过滤器,所以它应该为您提供所需的内容。

        4
  •  -1
  •   Rajat Bhatnagar    6 年前

    此解决方案适用于PostgreSQL。 你可以使用 横向连接 在PostgreSQL中可用。下面是如何在查询中使用它。

    SELECT u.username, c._postCount
    FROM User u
    INNER JOIN LATERAL (
        SELECT p.user, COUNT(*) AS _postCount
        FROM Posting p
        WHERE p.user = u.id
        GROUP BY p.user
    ) c ON c.user = u.id
    WHERE u.joinDate < '2009-10-10';
    

    这是一个你可以使用的参考资料。 https://medium.com/kkempin/postgresqls-lateral-join-bfd6bd0199df