好的,我以不同的方式解决了这个问题,最终达到了预期的结果。如果有人遇到同样的问题,这里是代码。我解决的方法是使用“动态”视图而不是循环。我不确定这是否是最优雅的做事方式,但我仍在学习,它对我有用,嘿!
1) 首先是创建表
CREATE TABLE table2 (
DateT date DEFAULT NULL,
HTeam varchar(255) DEFAULT NULL,
ATeam varchar(255) DEFAULT NULL,
HScore int(10) UNSIGNED DEFAULT NULL,
AScore int(10) UNSIGNED DEFAULT NULL
) ENGINE = INNODB;
2) 填充数据
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-01', 'T1', 'T2', 1, 0);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-01', 'T3', 'T4', 2, 1);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-08', 'T2', 'T3', 2, 2);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-08', 'T4', 'T1', 0, 2);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-15', 'T1', 'T3', 3, 1);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-15', 'T2', 'T4', 1, 2);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-22', 'T4', 'T2', 3, 2);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-22', 'T3', 'T1', 0, 0);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-29', 'T1', 'T4', 1, 1);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-03-29', 'T3', 'T2', 4, 2);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-04-05', 'T2', 'T1', 0, 2);
INSERT INTO test.table2(DateT, HTeam, ATeam, HScore, AScore) VALUES
('2014-04-05', 'T4', 'T3', 3, 1);
3) 接下来,我创建了一些函数,以后可以在视图中使用它们以使它们以“动态”方式运行。这是我在这个网站上遇到的一个小技巧:
DROP FUNCTION IF EXISTS func_hteam;
CREATE FUNCTION func_hteam() RETURNS VARCHAR(255) DETERMINISTIC
RETURN @hteam;
DROP FUNCTION IF EXISTS func_ateam;
CREATE FUNCTION func_ateam() RETURNS VARCHAR(255) DETERMINISTIC
RETURN @ateam;
DROP FUNCTION IF EXISTS func_datet;
CREATE FUNCTION func_datet() RETURNS date DETERMINISTIC
RETURN @datet;
4) 接下来,我创建了一个“动态”视图:
DROP VIEW IF EXISTS view_total;
CREATE VIEW view_total (DateT, HTeam, ATeam, HScore, AScore, Total)
AS
(SELECT DateT, HTeam, ATeam, HScore, AScore, (HScore + AScore) AS 'Sum' FROM test.table2
WHERE (HTeam = func_hteam() OR ATeam = func_hteam()) AND DateT < func_datet()
ORDER BY DateT DESC LIMIT 4)
UNION DISTINCT
(SELECT DateT, HTeam, ATeam, HScore, AScore, (HScore + AScore) AS 'Sum' FROM test.table2
WHERE (HTeam = func_ateam() OR ATeam = func_ateam()) AND DateT < func_datet()
ORDER BY DateT DESC LIMIT 4)
ORDER BY DateT DESC;
5) 接下来,我创建了一个函数来计算前一个视图返回的所有行的总和:
DROP FUNCTION IF EXISTS func_total;
DELIMITER $$
CREATE FUNCTION func_total() RETURNS int DETERMINISTIC
BEGIN
DECLARE num int UNSIGNED DEFAULT 0;
SELECT SUM(total) INTO num FROM view_total;
RETURN (num);
END
$$
6) 最后,将所有这些结合在一起的函数:
DROP FUNCTION IF EXISTS func_final;
DELIMITER $$
CREATE FUNCTION func_final(hteam VARCHAR(255), ateam VARCHAR(255), datet DATE) RETURNS int DETERMINISTIC
BEGIN
DECLARE total INT DEFAULT 0;
SELECT func_total() INTO total
FROM (SELECT @hteam:=hteam hteam,
@ateam:=ateam ateam,
@datet:=datet datet) t1, view_total t
ORDER BY t.datet ASC LIMIT 1;
RETURN (total);
END
$$
7) ...现在我们得到数据:
SELECT DateT, HTeam, ATeam, HScore, AScore, func_final(HTeam, ATeam, Datet) AS TOTAL
FROM table2 ORDER BY DateT DESC;
所有作品,可以用更好的方式编写吗?也许吧,但在这个阶段这超出了我的能力:)
美好的一天! :P