【问题标题】:MySQL Correlated SubqueriesMySQL 相关子查询
【发布时间】:2012-07-13 21:50:50
【问题描述】:

我发现下面的 SQL 是不可能的,因为 MySQL 中的相关子查询无法访问外部查询,当我运行下面的查询时,我得到“找不到 player.playerid”的错误

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 

【问题讨论】:

  • 您能否提供一些样本数据(来自所有相关表),然后提供一个样本结果集(使用与样本表日期正确相关的“真实”样本值)?示例结果集应该是您从查询中想要的结果。也许包含您所说的有效子查询的结果也会有所帮助。

标签: mysql


【解决方案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 drafts WHERE type = 3)" 是一个常数,你可以:

SELECT COUNT(drafts.id) FROM Drafts WHERE type = 3 into @total_mocks;

然后使用@total_mocks 替换表达式“(SELECT COUNT(drafts.id) FROM drafts WHERE type = 3)”

试试看

【讨论】:

  • 谢谢您,先生,让我找到了解决问题的正确方向:)。我把最后的查询放在最上面。
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 2011-06-09
  • 1970-01-01
  • 2011-11-04
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多