2012-07-13 140 views
0

我發現以下SQL是不可能的,因爲MySQL中的相關子查詢無法訪問外部查詢,當我運行以下查詢時,出現「player.playerid」錯誤發現」MySQL相關子查詢

SELECT player.position, player.playerid, adp.average_draft_position FROM player, (
    SELECT ((ad_p.mult + ad_p.pick_sum)/ad_p.total_mocks) AS average_draft_position FROM (
     SELECT draft_c.total_mocks as total_mocks, 
       ((draft_c.total_mocks - player_c.total_picks) * 252) AS mult, 
       SUM(overall_pick) AS pick_sum FROM draft_history JOIN drafts ON drafts.id = draft_history.draftid, 
      (
       SELECT COUNT(drafts.id) AS total_mocks FROM drafts WHERE type = 3 
      ) AS draft_c, (
       SELECT COUNT(draft_history.playerid) AS total_picks FROM draft_history WHERE draft_history.playerid = player.playerid 
      ) AS player_c WHERE draft_history.playerid = player.playerid 
    ) AS ad_p 
) AS adp WHERE player.sportid = 1 AND player.position IN ('x', 'y', 'z') ORDER BY adp.average_draft_position ASC 

我試圖使用出發,按照上面的子查詢,

SELECT ((adp.mult + adp.pick_sum)/adp.total_mocks) AS average_draft_position FROM (
      SELECT draft_c.total_mocks as total_mocks, ((draft_c.total_mocks - player_c.total_picks) * 252) AS mult, SUM(overall_pick) AS pick_sum FROM draft_history JOIN drafts ON drafts.id = draft_history.draftid, 
      (
       SELECT COUNT(id) AS total_mocks FROM drafts WHERE type = :type 
      ) AS draft_c, (
       SELECT COUNT(playerid) AS total_picks FROM draft_history WHERE playerid = :playerid 
      ) AS player_c WHERE playerid = :playerid 
     ) as adp 

這將確定平均位置的用戶已經拾取整個歷史,包括情況下,當用戶爲沒有通過對他們的總和應用權重來選擇,這個工作。

上面的第一個查詢試圖採取這種方式,並選擇當前存在於給定位置的所有用戶獲取平均位置並按它排序。

我並不擅長SQL,所以我可能會做得更好,如果我可以更好地解釋這一點,請讓我知道。

問題與給定的查詢解決,

SELECT position, 
     playerid, 
     ((((adp.total_mocks - adp.participated_mocks) * 252) + adp.pick_sum)/adp.total_mocks) AS average_draft_position 
FROM 
(  
    SELECT player.position, 
      player.playerid, 
      (SELECT COUNT(drafts.id) FROM drafts WHERE type = 3) as total_mocks, 
      COUNT(draft_history.playerid) as participated_mocks, 
      SUM(overall_pick) AS pick_sum 
    FROM draft_history 
    INNER JOIN drafts 
     ON drafts.id = draft_history.draftid 
    INNER JOIN player 
     ON player.sportid = 1 
    AND player.position IN ('QB') 
    AND draft_history.playerid = player.playerid 
    GROUP BY player.position, player.playerid 
) adp ORDER BY average_draft_position ASC 
+0

你能提供一些示例數據(從所有相關表格)然後抽樣結果集(使用與樣本表日期恰當相關的「真實」樣本值)?示例結果集應該是查詢中您想要的*。也許這也有助於包含你所說的子查詢的結果。 – 2012-07-13 04:51:04

回答

1

我想我能理解這一點。 試試這個:

select position, 
     playerid, 
     ((adp.mult + adp.pick_sum)/adp.total_mocks) AS average_draft_position 
from 
(  
    SELECT player.position, 
      player.playerid, 
      (SELECT COUNT(drafts.id) FROM drafts WHERE type = 3) as total_mocks 
      (
       (SELECT COUNT(drafts.id) FROM drafts WHERE type = 3) 
       - COUNT(draft_history.playerid) 
      )*252 as mult, 
      SUM(overall_pick) AS pick_sum 
    FROM draft_history 
    INNER JOIN drafts 
     ON drafts.id = draft_history.draftid 
    INNER JOIN player 
     ON player.sportid = 1 
    AND player.position IN ('x', 'y', 'z') 
    AND draft_history.playerid = player.playerid 
    group by player.position, player.playerid 
) adp 
order by 3 asc 

如果 「(SELECT COUNT(drafts.id)FROM草案其中type = 3)」 是一個常數,您可以:

SELECT COUNT(drafts.id)FROM草案WHERE在@total_mocks中鍵入= 3;

然後用@total_mocks替換 「(FROM草案SELECT COUNT(drafts.id)其中type = 3)」 表達

只是嘗試

+0

謝謝先生,讓我在正確的方向來解決:)。我把最後一個查詢放在頂部。 – Nick 2012-07-13 13:50:02