2010-01-28 63 views
3

有一個表用戶,並且有一個字段invite_by_id顯示邀請該用戶的人員的用戶標識。需要使用MySQL查詢返回來自用戶的所有字段的行以及顯示每個用戶邀請了多少人的invites_count字段。 事情是這樣的:如何製作嵌套查詢?

SELECT 
    User.*, Count.count 
FROM 
    users AS User, 
    (
     SELECT COUNT(*) AS count FROM users WHERE users.invited_by_id=User.id 
    ) AS Count; 

這個人是不是工作,所以我需要一個工作之一。

回答

5
SELECT u.*, 
     (
     SELECT COUNT(*) 
     FROM users ui 
     WHERE ui.invited_by_id = u.id 
     ) AS cnt 
FROM users u  
+0

+1:是的,列列表中的子查詢。這當然也有效。很好的答案。 – Asaph 2010-01-28 16:23:09

+0

這也很好地處理ORDER BY和LIMIT:在子查詢確實需要它之前不會評估子查詢。 – Quassnoi 2010-01-28 16:29:57

+0

@Quassnoi:但是它會爲每一行評估一次子查詢嗎?如果是這樣,那麼在不使用'ORDER BY'和'LIMIT'的情況下,這可能會導致性能問題。 – Asaph 2010-01-28 16:48:57

4

好的,首先,count是sql中的保留字,因此您不能將其用作表別名(除非您以某種方式引用它,但不要這樣做)。其次,解決這個問題的真正方法是在子查詢中引入GROUP BY子句。

試試這個:

SELECT user3.*, subquery.theCount FROM 
    users AS user3 
INNER JOIN ( 
    SELECT 
     user1.id, count(user2.id) AS theCount 
    FROM 
     users AS user1 
    LEFT OUTER JOIN 
     users AS user2 ON user2.invited_by_id=user1.id 
    GROUP BY user1.id 
) AS subquery ON subquery.id=user3.id; 

下面是關於MySQL一個骯髒的小祕密:它可以讓你與GROUP BY陳述欺騙和選擇不在GROUP BY名單,也未在聚合函數列。其他RMDMS不會讓你這樣做。

SELECT 
    user1.*, count(user2.id) AS theCount 
FROM 
    users AS user1 
LEFT OUTER JOIN 
    users AS user2 ON user2.invited_by_id=user1.id 
GROUP BY user1.id; 
+1

+1,漂亮的答案 – 2010-01-28 16:12:38

+0

謝謝。對我來說似乎很神奇。我不太瞭解GROUP BY語句的需求和用法。 – vian 2010-01-28 17:15:02