MYSQL:我可以在子查询中使用外部查询表别名吗?

时间:2013-06-09 09:49:17

标签: mysql sql database mysqli

这是我的问题:

select uact.onAssetID as AssetID, a1.value as AssetValue,
uact.CommentID, a2.value from useractivity uact inner join asset a1 on
uact.onAssetID=a1.ID inner join (select * from asset inner join
useractivity on uact.onAssetID=a1.ID group by a1.ID limit 3) a2 on
uact.CommentID=a2.ID;
Error: ERROR 1054 (42S22): Unknown column 'uact.onassetID' in 'on clause'

我在尝试做什么? 想象一下Table1有10个学生姓名,现在Table2有10个记录(行),每个学生都在table1中。如果我尝试在两个表上使用join,它将返回100条记录(每个学生10条记录)。我想要的是,每个学生限制连接返回的结果5个记录 所以,我应该为每个学生获得5条记录,因此输出50行

表格结构(资产):

ID | TypeID | CategoryID | Worth | isActive 
| CreationDate | ExpiryDate Value | AssetOwner 

表格结构(使用率) | ID | ActivityTypeID | UserID | Time | onAssetID | CommentID

注意: 1)两个表的ID是主键 2)useractivity中的onAssetID和commentID是指在资产表

中引用ID的外键

如果您需要更多详细信息,请随时与我们联系

3 个答案:

答案 0 :(得分:2)

  

我在尝试做什么?想象一下Table1有10个学生姓名,   现在有Table2,每个学生有10条记录(行)   见表1。如果我尝试在两个表上使用join,它将返回   100条记录(每个学生10条记录)。我想要的是限制   每个学生加入5条记录返回的结果所以,我应该得到5分   每个学生的记录因此50行输出

回答这个问题: - 表1(studentid,.......) 表2(ID,.........,studentid)

select s.*,temp.* from (SELECT @var:=if(@var2= a.studentid,@var+1,1) sno, @var2:= studentid, a.*
FROM Table2 a,(select @var:=0) b, (select @var2:=0) c 
order by studentid) temp, Table1 s where temp.sno<=5;
  

对于您的表结构: - 表结构(资产):ID | TypeID |   CategoryID |值得的isActive | CreationDate | ExpiryDate值|   AssetOwner表结构(使用率):| ID | ActivityTypeID |   用户ID |时间| onAssetID | CommentID

select s.*,temp.* 
from 
     (SELECT @var:=if(@var2= a.onAssetID,@var+1,1) sno, @var2:= onAssetID, a.*
      FROM useractivity a,(select @var:=0) b, (select @var2:=0) c 
      order by onAssetID) temp, asset s 
where temp.sno<=5;

答案 1 :(得分:0)

您将其称为a2.column_name,因为您已调用该查询a2

答案 2 :(得分:0)

您应该可以这样做,但前提是您将其放在正确的细分中。请注意,在FROM子查询中这样做会严重妨碍性能。

无论如何,您的问题似乎是您引用了uacta1未定义的地方,这是违反语法的行为。将别名添加到子查询中,如果需要,请在WHERE子句中引用外部查询。

更改

(
 SELECT * 
 FROM asset 
 INNER JOIN useractivity ON uact.onAssetID=a1.ID 
 GROUP BY a1.ID 
 LIMIT 3
) a2

(
 SELECT ID, Value 
 FROM asset AS a
 INNER JOIN useractivity AS ua 
   ON ua.onAssetID=a.ID 
) a2

(请注意,您的LIMIT子句将适用于 ENTIRE 查询,而a2只会返回三行,而不是每个连接三行。)