Вопрос

У вас есть таблица пользователей, и есть поле приглашённое_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;

Этот не работает, поэтому мне нужен рабочий.

Это было полезно?

Решение

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

Другие советы

Хорошо, во-первых, 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 list, а также не в агрегатных функциях.Другие 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top