编辑:这已经解决,需要子查询进入外观表。这是工作解决方案。
SELECT concat(m.nameFirst, ' ', m.nameLast) as Name,
m.playerID as playerID,
sum(b.HR) as HR
FROM Master AS m
INNER JOIN Batting AS b
ON m.playerID=b.playerID
WHERE ((m.weight/(m.height*m.height))*703) >= 27.99
AND m.playerID in (SELECT playerID FROM appearances GROUP BY playerID HAVING SUM(G_1b+G_dh)/SUM(G_All) >= .667)
GROUP BY playerID, Name
HAVING HR >= 100
ORDER BY HR desc;
如果有人熟悉的话,我正在使用拉赫曼棒球统计数据库。
我正在尝试检索一个包含所有大型猛击一垒手的列表,我需要的数据分布在三个不同的表中。我这样做的方法是找到最低BMI的玩家,他们在第一次/指定的击球手上花了至少2/3的时间,并且拥有最少的本垒打数。
'大师'包含球员姓名,身高,体重(BMI)。
'击球'房子HR。
'外观'包括最初玩的游戏,在DH玩的游戏以及总游戏。
所有三个数据库都通过相同的'playerID'值连接。
这是我当前的查询:
SELECT concat(m.nameFirst, ' ', m.nameLast) as Name,
m.playerID as playerID,
sum(b.HR) as HR
FROM Master AS m
INNER JOIN Batting AS b
ON m.playerID=b.playerID
INNER JOIN Appearances AS a
ON m.playerID=a.playerID
GROUP BY Name, playerID
HAVING ((m.weight/(m.height*m.height))*703) >= 27.99
AND ((SUM(IFNULL(a.G_1b,0)+IFNULL(a.G_dh,0)))/SUM(IFNULL(a.G_All,0))) >= .667
AND HR >= 200
ORDER BY HR desc;
这对我来说是正确的,但是当它输入时它永远不会返回(永远运行) - 由于某种原因,我认为它与外观表的内部连接有关。我也觉得在“HAVING”子句中组合m.weight / m.height存在问题,但是涉及聚合时我不能使用“WHERE”。我该怎么办?
感谢您的帮助!
编辑:删除所有条件后,我仍然得到相同(无穷无尽)的结果。这是我更简单的查询:
SELECT concat(m.nameFirst, ' ', m.nameLast) as Name,
m.playerID as playerID,
sum(b.HR) as HR
FROM Master AS m
INNER JOIN Batting AS b
ON m.playerID=b.playerID
INNER JOIN Appearances AS a
ON m.playerID=a.playerID
GROUP BY playerID, Name
ORDER BY HR desc;
答案 0 :(得分:2)
我的猜测是你的查询问题是每个玩家多次出现(出场)和蝙蝠很多次。假设一名球员在100场比赛中击球1000次。然后连接 - 正如你所写的那样 - 将为该播放器提供100,000行。
这只是猜测,因为您没有提供样本数据来验证这是否是问题。
解决方案是将appearances
和games
表预先聚合为子查询(在playerId
级别),然后将它们连接起来。