我有两个表 - 跨越个人职业生涯的每条记录的击球年份字段,以及个人的首次亮相年份和最后一年。所有这 3 个都是smallint。我使用以下查询仅获取 DebutYear+value 到 DebutYear+2nd-value 之间指定职业范围内的击球年份。 在这种情况下,它应该只对这些年份的 AB 求和,但它是对击球表中的所有年份求和。 我对 JOINS 有点缺乏经验。任何帮助将不胜感激!
SELECT CONCAT(FirstName, ' ', LastName) AS Name, B.PersonID, SUM(AB) AS AB
FROM Batting B
INNER JOIN Person P ON P.PersonID = B.PersonID
AND (B.Year >= (P.DebutYear+1) AND B.Year <= (P.DebutYear+2))
WHERE B.PersonID = P.PersonID
GROUP BY B.PersonID
HAVING (AB >= 10000)
ORDER BY AB Desc, LastName, FirstName
LIMIT 1000
过滤器应应用于
WHERE
子句,而不是 JOIN
。
SELECT CONCAT(P.FirstName, ' ', P.LastName) AS Name, B.PersonID, SUM(B.AB) AS AB
FROM Batting B
INNER JOIN Person P ON P.PersonID = B.PersonID
WHERE B.Year BETWEEN (P.DebutYear + 1) AND (P.DebutYear + 2)
GROUP BY B.PersonID, P.FirstName, P.LastName
HAVING SUM(B.AB) >= 1000
ORDER BY AB DESC, P.LastName, P.FirstName
LIMIT 1000;
这是一个工作示例:
-- Reset
DROP TABLE IF EXISTS Batting;
DROP TABLE IF EXISTS Person;
-- Schemas
CREATE TABLE Person (
PersonID INT PRIMARY KEY,
FirstName VARCHAR(100),
LastName VARCHAR(100),
DebutYear SMALLINT,
FinalYear SMALLINT
);
CREATE TABLE Batting (
BattingID INT PRIMARY KEY,
PersonID INT,
Year SMALLINT,
AB INT, -- At Bats
FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
);
-- Sample data
INSERT INTO Person (PersonID, FirstName, LastName, DebutYear, FinalYear)
VALUES
(1 , 'John' , 'Doe' , 2000 , 2010),
(2 , 'Jimmy' , 'Smith' , 1995 , 2005),
(3 , 'James' , 'Brown' , 1972 , 1982);
INSERT INTO Batting (BattingID, PersonID, Year, AB)
VALUES
(1, 1, 2001, 500), -- John Doe (2001, DebutYear + 1, total so far: 500)
(2, 1, 2002, 600), -- John Doe (2002, DebutYear + 2, total so far: 1100)
(3, 1, 2003, 700), -- John Doe (2003, outside of the range, not included)
(4, 2, 1996, 400), -- Jimmy Smith (1996, DebutYear + 1, total so far: 400)
(5, 2, 1997, 550), -- Jimmy Smith (1997, DebutYear + 2, total so far: 950, below threshold)
(6, 3, 1973, 600), -- James Brown (1973, DebutYear + 1, total so far: 600)
(7, 3, 1974, 700); -- James Brown (1974, DebutYear + 2, total so far: 1300)
-- Query for players with an AB >= 1000 between DebutYear + 1 and DebutYear + 2
SELECT CONCAT(P.FirstName, ' ', P.LastName) AS Name, B.PersonID, SUM(B.AB) AS AB
FROM Batting B
INNER JOIN Person P ON P.PersonID = B.PersonID
WHERE B.Year BETWEEN (P.DebutYear + 1) AND (P.DebutYear + 2)
GROUP BY B.PersonID, P.FirstName, P.LastName
HAVING SUM(B.AB) >= 1000
ORDER BY AB DESC, P.LastName, P.FirstName
LIMIT 1000;
结果应该只包括 James 和 John,但不包括 Jimmy。
姓名 | 人员ID | AB |
---|---|---|
詹姆斯·布朗 | 3 | 1300 |
约翰·多伊 | 1 | 1100 |