Ссылка на внешние таблицы запросов в подзапросе
Можно ли ссылаться на внешний запрос в подзапросе с MySQL? Я знаю, что есть случаи, когда это возможно:
SELECT *
FROM table t1
WHERE t1.date = (
SELECT MAX(date)
FROM table t2
WHERE t2.id = t1.id
);
Но мне интересно, может ли что-то подобное работать:
SELECT u.username, c._postCount
FROM User u
INNER JOIN (
SELECT p.user, COUNT(*) AS _postCount
FROM Posting p
--# This is the reference I would need:
WHERE p.user = u.id
GROUP BY p.user
) c ON c.user = u.id
WHERE u.joinDate < '2009-10-10';
Я знаю, что я мог бы достичь того же, используя GROUP BY
или, потянув внешнее предложение WHERE
в подзапрос, но мне это нужно для автоматической генерации SQL и не может использовать альтернативу по другим причинам.
ОБНОВЛЕНИЕ. Извините, вопрос привел к некоторой путанице: первый запрос - это просто рабочий пример, чтобы продемонстрировать, что мне не нужно.
ОБНОВЛЕНИЕ 2. Мне нужны оба сравнения u.id = p.user: первый подсчитывает пользователей, которые присоединились до "2009-10-10", а другой - условие объединения, которое связывает таблицы правильно.
Ответы
Ответ 1
Я думаю, что это не сработает, потому что вы ссылаетесь на свою производную таблицу 'c' как часть соединения.
однако вы можете просто вынуть WHERE p.user = u.id
хотя и заменить на GROUP BY p.user
в производной таблице, так как ON c.user = u.id
будет иметь тот же эффект.
Ответ 2
Разве это не то, что вам нужно?
SELECT u.username, c._postCount
FROM User u
INNER JOIN (
SELECT p.user, COUNT(*) AS _postCount
FROM Posting p
GROUP BY p.user
) c ON c.user = u.id
WHERE u.joinDate < '2009-10-10';
Причина этого будет заключаться в том, что природа самого соединения будет фильтроваться на пользователе. Вы не должны иметь предложение WHERE, явно фильтрующее пользователя.
Ответ 3
очень близко...
WHERE t1.date = (
SELECT MAX(date)
измените на
WHERE t1.date IN (
SELECT MAX(date)
Так как ваш запрос делает MAX(), он всегда будет возвращать только одну дату... так как ваш суб-выбор имеет фильтр по уникальному идентификатору, он должен предоставить вам то, что вы хотите.
Ответ 4
Это, вероятно, лучше:
SELECT u.username,
(SELECT COUNT(*) FROM Posting WHERE user = u.id) as _postCount
FROM User u WHERE u.joinDate < '2009-10-10';
Ответ 5
Это решение для postgresql. Вы можете использовать LATERAL JOIN, который доступен в postgresql. Вот как вы можете использовать это в своем запросе.
SELECT u.username, c._postCount
FROM User u
INNER JOIN LATERAL (
SELECT p.user, COUNT(*) AS _postCount
FROM Posting p
WHERE p.user = u.id
GROUP BY p.user
) c ON c.user = u.id
WHERE u.joinDate < '2009-10-10';
Вот ссылка, которую вы могли бы использовать. https://medium.com/kkempin/postgresqls-lateral-join-bfd6bd0199df