Подтвердить что ты не робот

Ссылка на внешние таблицы запросов в подзапросе

Можно ли ссылаться на внешний запрос в подзапросе с 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", а другой - условие объединения, которое связывает таблицы правильно.

4b9b3361

Ответ 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