Как сделать вложенный запрос?
-
23-09-2019 - |
Вопрос
У вас есть таблица пользователей, и есть поле приглашённое_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;