2009-12-29 69 views
41

有没有办法在mySQL中的子查询中指定父查询字段?如何在mySQL中的子查询中指定父查询字段?

例如:
我已经用PHP写了一个基本的公告板类型程序。

在数据库中,每个帖子都包含:id(PK)和parent_id(父帖子的ID)。如果帖子本身是父项,那么它的parent_id设置为0.

我想写一个mySQL查询,它将查找每个父级帖子以及父级拥有的子级数。

$query = "SELECT id, (
     SELECT COUNT(1) 
     FROM post_table 
     WHERE parent_id = id 
) as num_children 
FROM post_table 
WHERE parent_id = 0"; 

棘手的部分是第一ID不知道它应该是指第二ID是子查询之外。我知道我可以做SELECT id AS id_tmp,然后在子查询中引用它,但是如果我还想返回id并将“id”保留为列名称,那么我必须执行一个查询返回我2列使用相同的数据(这似乎凌乱我)

$query = "SELECT id, id AS id_tmp, 
      (SELECT COUNT(1) 
      FROM post_table 
      WHERE parent_id = id_tmp) as num_children 
     FROM post_table 
     WHERE parent_id = 0"; 

的混乱的方式工作得很好,但我觉得有机会在这里学到的东西,所以我想我会发布问题。

回答

60

如何:

$query = "SELECT p1.id, 
       (SELECT COUNT(1) 
        FROM post_table p2 
        WHERE p2.parent_id = p1.id) as num_children 
      FROM post_table p1 
      WHERE p1.parent_id = 0"; 

,或者如果你把一个别名上p1.id,你可能会说:

$query = "SELECT p1.id as p1_id, 
       (SELECT COUNT(1) 
        FROM post_table p2 
        WHERE p2.parent_id = p1.id) as num_children 
      FROM post_table p1 
      WHERE p1.parent_id = 0"; 
+0

如果我为p1.id取了别名,该怎么办? – 2014-10-21 10:08:55

+0

这是什么意思? “别名为”? – Don 2014-10-22 15:47:58

+0

如果我采用了别名:“SELECT p1.id as MYID”,那么查询将会是什么? – 2014-10-29 12:30:40

2

给这个表中的唯一名称:

$query = "SELECT a.id, (SELECT COUNT(1) FROM post_table b WHERE parent_id = a.id) as num_children FROM post_table a WHERE a.parent_id = 0"; 
4

你可以尝试这样的事情

SELECT pt.id, 
     CountTable.Cnt 
FROM post_table pt LEFT JOIN 
     (
      SELECT parent_id, 
        COUNT(1) Cnt 
      FROM post_table 
      WHERE parent_id <> 0 
      GROUP BY parent_id 
     ) CountTable ON pt.id = CountTable.parent_id 
WHERE pt.parent_id = 0 

要回到你的榜样,用在子主表的别名选择

SELECT pt.id, 
     (SELECT COUNT(1) FROM post_table WHERE parent_id = pt.id) 
FROM post_table pt 
WHERE pt.parent_id = 0 
0

以下语法在甲骨文工作。你可以测试,如果相同的作品在MYSQL呢? 它在Oracle中称为标量子查询。

如果您使用同一个表两次,您只需要以不同的方式别名这两个表以区分它们。

sql> select empno, 
    2   (select dname from dept where deptno = emp.deptno) dname 
    3 from emp 
    4 where empno = 7369; 

    EMPNO DNAME 
---------- -------------- 
     7369 RESEARCH 

sql> select parent.empno, 
    2   (select mgr from emp where empno = parent.empno) mgr 
    3 from emp parent 
    4 where empno = 7876; 

    EMPNO  MGR 
---------- ---------- 
     7876  7788 
0

谢谢唐。我有一个嵌套查询,如下所示,其中WHERE子句无法确定别名v1。这里是一个不正常的代码:

Select 
    teamid, 
    teamname 
FROM 
    team as t1 
INNER JOIN (
    SELECT 
     venue_id, 
     venue_scores, 
     venue_name 
    FROM venue 
    WHERE venue_scores = (
     SELECT 
      MAX(venue_scores) 
     FROM venue as v2 
     WHERE v2.venue_id = v1.venue_id  /* this where clause wasn't working */ 
    ) as v1 /* v1 alias already present here */ 
); 

所以,我刚添加的别名v1再次JOIN内。这使它工作。

Select 
    teamid, 
    teamname 
FROM 
    team as t1 
INNER JOIN (
    SELECT 
     venue_id, 
     venue_scores, 
     venue_name 
    FROM venue as v1    /* added alias v1 here again */ 
    WHERE venue_scores = (
     SELECT 
      MAX(venue_scores) 
     FROM venue as v2 
     WHERE v2.venue_id = v1.venue_id /* Now this works!! */ 
    ) as v1  /* v1 alias already present here */ 
); 

希望这对别人有帮助。