2016-08-20 75 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; 

我通過它的工作,它原來我不知道因爲我不得不將我的內聯視圖別名,我需要在原始選擇語句中指定它。這個概念在我的課程中令人遺憾地沒有涉及。我欣賞那些提供有用提示與粗魯評論的人。所以,謝謝德魯和馬特