Как сделать вложенный запрос? - PullRequest
4 голосов
/ 28 января 2010

У вас есть таблица пользователей, и есть поле sent_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;

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

Ответы [ 2 ]

6 голосов
/ 28 января 2010
SELECT  u.*,
        (
        SELECT  COUNT(*)
        FROM    users ui
        WHERE   ui.invited_by_id = u.id
        ) AS cnt
FROM    users u    
4 голосов
/ 28 января 2010

Хорошо, во-первых, 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;
...