4

有一个表 users 并且有一个字段被邀请的_by_id 显示邀请该用户的人的用户 ID。需要创建一个 MySQL 查询返回行,其中包含来自用户的所有字段以及显示每个用户邀请了多少人的邀请计数字段。像这样的东西:

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

这个不工作,所以我需要一个工作。

4

2 回答 2

6
SELECT  u.*,
        (
        SELECT  COUNT(*)
        FROM    users ui
        WHERE   ui.invited_by_id = u.id
        ) AS cnt
FROM    users u    
于 2010-01-28T16:18:33.737 回答
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;
于 2010-01-28T16:10:00.030 回答