2009-12-29 61 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 */ 
); 

希望這對別人有幫助。