Каждая производная таблица должна иметь свою собственную ошибку псевдонима
Я получаю эту ошибку при запуске следующего запроса:
SELECT MAX( DateTime )
FROM (
(
SELECT DateTime
FROM Class_Searches
)
UNION ALL (
SELECT DateTime
FROM Book_Searches
)
)
WHERE User_Email = '[email protected]'
AND DateTime > NOW( ) - INTERVAL 30 DAY
Я знаю, что мне нужно добавить псевдонимы, но я не уверен, где
Ответы
Ответ 1
Вам нужен псевдоним для подзапроса, и вам нужно применить условия либо к обоим запросам, которые вы объединяете:
SELECT MAX(DateTime)
FROM (
SELECT DateTime
FROM Class_Searches
WHERE User_Email = '[email protected]'
AND DateTime > NOW( ) - INTERVAL 30 DAY
UNION ALL
SELECT DateTime
FROM Book_Searches
WHERE User_Email = '[email protected]'
AND DateTime > NOW( ) - INTERVAL 30 DAY
) AS x
или вернуть данные, чтобы вы могли применить условие во внешнем запросе:
SELECT MAX(DateTime)
FROM (
SELECT DateTime, User_Email
FROM Class_Searches
UNION ALL
SELECT DateTime, User_Email
FROM Book_Searches
) AS x
WHERE User_Email = '[email protected]'
AND DateTime > NOW( ) - INTERVAL 30 DAY
Ответ 2
Псевдоним - это когда вы переименовываете что-то, например SELECT t.time from table t
, t
является псевдонимом для этой таблицы. В этом случае вам нужно предоставить псевдоним для таблиц, сгенерированных подзапросами:
SELECT MAX( ut.DateTime )
FROM (
(
SELECT DateTime
FROM Class_Searches
) cs
UNION ALL (
SELECT DateTime
FROM Book_Searches
) bs
) ut
WHERE User_Email = '[email protected]'
AND ut.DateTime > NOW( ) - INTERVAL 30 DAY
Это все равно не работает, потому что у вас нет столбца User_Email, возвращенного из UNION. Таким образом, попробуйте:
SELECT MAX( ut.DateTime )
FROM (
(
SELECT DateTime, User_Email
FROM Class_Searches
) cs
UNION ALL (
SELECT DateTime, User_Email
FROM Book_Searches
) bs
) ut
WHERE ut.User_Email = '[email protected]'
AND ut.DateTime > NOW( ) - INTERVAL 30 DAY
Возможно, что это все равно не будет работать правильно из-за синтаксиса UNION, но, по крайней мере, это намного ближе.