Следующий запрос MySQL:
select `userID` as uID,
(select `siteID` from `users` where `userID` = uID) as `sID`,
from `actions`
where `sID` in (select `siteID` from `sites` where `foo` = "bar")
order by `timestamp` desc limit 100
… возвращает ошибку:
Unknown column 'sID' in 'IN/ALL/ANY subquery'
Я не понимаю то, что я делаю неправильно здесь. sID
вещью, как предполагается, не является столбец, но 'псевдоним' (чем это называют?) Я создал путем выполнения (select siteID from users where userID = uID) as sID
. И это даже не в IN
подзапрос.
Какие-либо идеи?
Править: @Roland: Спасибо за Ваш комментарий. У меня есть три таблицы, actions
, users
и sites
. Таблица actions
содержит a userID
поле, которое соответствует записи в users
таблица. Каждый пользователь в этой таблице (users
) имеет a siteID
. Я пытаюсь выбрать последние действия из actions
таблица, и связывает их с users
и sites
таблица для обнаружения, кто выполнил те действия, и на который сайт. Надежда, которая имеет смысл :)
Вам либо нужно вложить его в подзапрос:
SELECT *
FROM (
SELECT userID as uID, (select siteID from users where userID = actions.userID) as sID,
FROM actions
) q
WHERE sID IN (select siteID from sites where foo = "bar")
ORDER BY
timestamp DESC
LIMIT 100
, либо, лучше, переписать его как JOIN
SELECT a.userId, u.siteID
FROM actions a
JOIN users u
ON u.userID = a.userID
WHERE siteID IN
(
SELECT siteID
FROM sites
WHERE foo = 'bar'
)
ORDER BY
timestamp DESC
LIMIT 100
Создать следующие индексы:
actions (timestamp)
users (userId)
sites (foo, siteID)
Псевдоним столбца не устанавливается до тех пор, пока обработчик запроса не закончит выражение Select и не создаст первый промежуточный набор результатов, поэтому на него можно будет ссылаться только в группе By, (поскольку над промежуточным набором результатов оперирует выражение group By), если вы хотите не использовать его таким образом, установите псевдоним внутри подзапроса, тогда он будет находиться в наборе результатов, сгенерированном подзапросом, и, следовательно, доступен для внешнего запроса. Для иллюстрации
(Это не самый простой способ сделать этот запрос, но он показывает, как установить и использовать псевдоним столбца из подзапроса)
select a.userID as uID, z.Sid
from actions a
Join (select userID, siteID as sid1 from users) Z,
On z.userID = a.userID
where Z.sID in (select siteID from sites where foo = "bar")
order by timestamp desc limit 100
Попробуйте следующее:
SELECT
a.userID as uID
,u.siteID as sID
FROM
actions as a
INNER JOIN
users as u ON u.userID=a.userID
WHERE
u.siteID IN (SELECT siteID FROM sites WHERE foo = 'bar')
ORDER BY
a.timestamp DESC
LIMIT 100
Думаю, причина ошибки в том, что псевдоним недоступен в команде ГДЕ, поэтому у нас есть HAVING.
select `userID` as uID,
(select `siteID` from `users` where `userID` = uID) as `sID`,
from `actions`
HAVING `sID` in (select `siteID` from `sites` where `foo` = "bar")
order by `timestamp` desc limit 100
Хотя я также согласен с другими ответами, что ваш запрос может быть лучше структурирован.
Попробуйте следующее
SELECT
a.userID as uID
,u.siteID as sID
FROM
actions as a
INNER JOIN
users as u ON u.userID = a.userID
INNER JOIN
sites as s ON u.siteID = s.siteID
WHERE
s.foo = 'bar'
ORDER BY
a.timestamp DESC
LIMIT 100
Если вы хотите использовать поле из раздела выбора позднее, вы можете попробовать подвыборку
SELECT One,
Two,
One + Two as Three
FROM (
SELECT 1 AS One,
2 as Two
) sub