MySQL内联查看“未知字段”

时间:2016-08-20 17:55:50

标签: mysql sql

我目前正在参加DBS课程,我正在研究内联视图:

SELECT userId, firstname, lastname, gender
FROM  
(SELECT COUNT(dvdId) dvdId, u.userId
FROM userDVD
JOIN users u ON userDVD.userId = u.userId
GROUP BY userId) as T
WHERE gender = 'F';

当我运行Query时,它返回字段列表中的错误未知列。如果我尝试指定

u.firstname, u.lastname, u.gender

我返回相同的错误。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

SELECT T.userId, T.firstname, T.lastname, T.gender 
FROM (
SELECT users.userId, users.firstname, users.lastname, users.gender
FROM userDVD 
JOIN users ON userDVD.userId = users.userId 
WHERE gender = 'F' GROUP BY userId
 ) as T;

我完成了它,结果我没有意识到,因为我必须为我的内联视图添加别名,我需要在原始的select语句中指定它。我的课程遗憾地没有涵盖这个概念。我感谢那些提供有用提示和粗鲁评论的人。所以,谢谢Drew和Matt

答案 1 :(得分:0)

Drew是正确的,你有一个派生表T,但我会尝试添加一些可能对你有用的细节。

  • 你有一个派生表T
  • 外部查询(第一次选择)
  • 内部查询(括号中的第二个选择)
  • 内部查询为用户使用u的表别名。
  • 内部查询的最后一列是dvdId,它是userDvd表和userId中的dvdId的计数
  • 由于外部查询被限制为使用内部查询的最终记录集,因此只能选择那两列,并且看到它们不包含您收到错误的名字,姓氏或性别。

如果您希望保持查询相同但使用这些列,则可以将派生表连接回用户表并获取所需的列。比如这个:

SELECT userId, firstname, lastname, gender
FROM  
    (SELECT COUNT(dvdId) dvdId, u.userId
    FROM userDVD
    JOIN users u ON userDVD.userId = u.userId
    GROUP BY userId) as T
    INNER JOIN users u2 
    ON t.user_id = u2.user_id
WHERE gender = 'F';

当您必须优化大型表上的聚合或查找重复项或类似内容时,返回原始表的技术非常有用。但是在您的情况下,您实际上只需要在结果集中所需的所有列上聚合一个查询,例如:

SELECT
     u.userId, u.firstname, u.lastname, u.gender, COUNT(d.dvdId) as DVDCount
FROM
    userDVD d
    JOIN users u
    ON d.userId = u.userId
WHERE u.gender = 'F'
GROUP BY
    u.userId, u.firstname, u.lastname, u.gender
;