Что случилось с этим запросом MySQL? ВЫБЕРИТЕ * AS 'x', как использовать x снова позже?

Следующий запрос 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 таблица для обнаружения, кто выполнил те действия, и на который сайт. Надежда, которая имеет смысл :)

5
задан Mathias Bynens 6 February 2010 в 00:10
поделиться

5 ответов

Вам либо нужно вложить его в подзапрос:

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)
12
ответ дан 18 December 2019 в 10:45
поделиться

Псевдоним столбца не устанавливается до тех пор, пока обработчик запроса не закончит выражение 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 
3
ответ дан 18 December 2019 в 10:45
поделиться

Попробуйте следующее:

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
1
ответ дан 18 December 2019 в 10:45
поделиться

Думаю, причина ошибки в том, что псевдоним недоступен в команде ГДЕ, поэтому у нас есть 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

Хотя я также согласен с другими ответами, что ваш запрос может быть лучше структурирован.

0
ответ дан 18 December 2019 в 10:45
поделиться

Попробуйте следующее

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
0
ответ дан 18 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: