5

次の 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、およびの 3 つのテーブルがusersありsitesます。テーブルには、テーブルのエントリに対応するフィールドactionsが含まれています。このテーブル ( ) 内のすべてのユーザーには、. テーブルから最新のアクションを選択し、テーブルにリンクして、それらのアクションを誰がどのサイトで実行したかを調べようとしています。それが理にかなっていることを願っています:)userIDusersuserssiteIDactionsuserssites

4

6 に答える 6

12

サブクエリで囲む必要があります。

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)
于 2009-12-30T16:19:15.127 に答える
3

列エイリアスは、クエリ プロセッサが Select 句を終了し、最初の中間結果セットを構築するまで確立されないため、グループ By でのみ参照できます (グループ 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 
于 2009-12-30T16:18:43.837 に答える
1

次のことを試してください。

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
于 2009-12-30T16:16:19.070 に答える
0

以下を試してください

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
于 2009-12-30T16:19:45.050 に答える
0

エラーの理由は、エイリアスが WHERE 命令で使用できないためだと思います。これが、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

クエリをより適切に構造化できるという他の回答にも同意しますが。

于 2009-12-30T16:19:58.140 に答える