2016-08-20 80 views
0

我目前在DBS课程,我的工作内嵌视图:MySQL的内嵌视图“未知领域”

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'; 

当我运行查询它的字段列表返回错误未知列。如果我试图指定

u.firstname, u.lastname, u.gender 

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

+2

您的查询没有任何意义。样本数据和期望的结果将有助于传达您想要做的事情。 –

回答

0

德鲁是正确的,你有一个派生表T,但我会尝试添加一些细节,可能对你有用,因为你在一门课程。

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

如果您希望保持查询相同,但要使用这些列,您可以将派生表加入用户表并获取所需的列。像这样的:

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 
; 
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; 

我通过它的工作,它原来我不知道因为我不得不将我的内联视图别名,我需要在原始选择语句中指定它。这个概念在我的课程中令人遗憾地没有涉及。我欣赏那些提供有用提示与粗鲁评论的人。所以,谢谢德鲁和马特