编辑:这个问题已经解决,需要对外观表进行子查询。这是有效的解决方案。
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;
如果有人熟悉的话,我正在使用 Lahman 棒球统计数据库。
我正在尝试检索所有大型强击一垒手的列表,而我需要的数据分布在三个不同的表中。我这样做的方法是寻找体重指数最低的球员,他们至少有 2/3 的时间花在第一/指定击球手上,并且本垒打次数最少。
“Master”包含玩家姓名、高度、体重(BMI)。
“击球”由人力资源部门负责。
“出场次数”包含首次参加的比赛、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;
最佳答案
我的猜测是,您的查询的问题在于每个球员都出现过多次(出场)并且多次击球。假设一名球员在 100 场比赛中击球 1000 次。然后,连接(如您所写)将包含该玩家的 100,000 行。
这只是一个猜测,因为您没有提供示例数据来验证这是否是问题所在。
解决方案是将 appearances
和 games
表预先聚合为子查询(在 playerId
级别),然后将它们连接回来。
关于MySQL 查询永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503293/