我有一个包含体育比赛的表格,其中包含日期、球队和结果。我想找到一支球队目前的连胜或连败记录。
我的表格如下所示:
+------------+----------+---------+---------------+------+------------+
| date_month | date_day | visitor | visitor_score | home | home_score |
+------------+----------+---------+---------------+------+------------+
| May | 1 | MyTeam | 90 | Z | 100 |
+------------+----------+---------+---------------+------+------------+
| April | 26 | X | 100 |MyTeam| 90 |
+------------+----------+---------+---------------+------+------------+
| April | 21 | Y | 90 |MyTeam| 100 |
+------------+----------+---------+---------------+------+------------+
| March | 25 | MyTeam | 90 | W | 100 |
+------------+----------+---------+---------------+------+------------+
我已经完成了按日期排序结果。
SELECT * FROM Schedule WHERE visitor_score>0
ORDER BY CASE
when `date_month` = 'May' then 1
when `date_month` = 'April' then 2
when `date_month` = 'March' then 3
else 4
end asc, date_day desc
问题是,如何找到一支球队的连胜纪录? Myteam
输掉了最后两场比赛,因此应该是 0
胜和 2
输。但如果它赢得了下一场比赛,显然应该是1
胜和0
输。
我知道如何提取胜利和失败(如下所示),但这就是我所坚持的点。
WHERE (visitor = 'MyTeam' && visitor_score>home_score) OR (home = 'MyTeam' && home_score>visitor_score)
最佳答案
我不会提示你的表结构。 我假设您无法更改表结构。
I already accomplished to order the result by date.
你的解决方案非常丑陋。考虑使用类似的东西:
SELECT STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y") AS date
请注意,我必须使用 YEAR(CURDATE()),因为年份在 STR_TO_DATE 函数中是强制性的,而且您似乎没有存储游戏的年份。
现在您可以简单地:ORDER BY date DESC
现在我将解释我想到的关于 W/L/D(赢、输、平局)连胜的第一个解决方案。
声明3个函数:
- retrieveLastResult (返回 W、L、D)
- retrieveLastGameDate (返回 date_month、date_day)
- retrieveFirstResultDateDifferentFromLastOne(返回结果与上一场比赛不同的第一场比赛的日期)
下面是每个函数主体的模拟。
一旦你有了这些功能,你就可以简单地做这样的事情:
SELECT COUNT(*), retrieveLastResult
FROM Schedule
WHERE
STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y")
BETWEEN DATE_SUB(retrieveFirstResultDateDifferentFromLastOne(retrieveLastResult,retrieveLastGameDate),INTERVAL 1 DAY)
AND retrieveLastGameDate()
检索LastResult函数
SELECT
IF(`home` = "MyTeam",
CASE
WHEN `home_score` > `visitor_score` THEN "W"
WHEN `home_score` < `visitor_score` THEN "L"
WHEN `home_score` = `visitor_score` THEN "D"
END,
CASE
WHEN `visitor_score` > `home_score` THEN "W"
WHEN `visitor_score` < `home_score` THEN "L"
WHEN `visitor_score` = `home_score` THEN "D"
END
)
FROM schedule
ORDER BY STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y") DESC
LIMIT 1
检索LastGameDate函数
SELECT STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y") as date
FROM schedule
ORDER BY date
LIMIT 1
检索FirstResultDateDifferentFromLastOne函数
SELECT date
FROM schedule
WHERE
IF(`home` = "MyTeam",
CASE
WHEN `home_score` > `visitor_score` THEN "W"
WHEN `home_score` < `visitor_score` THEN "L"
WHEN `home_score` = `visitor_score` THEN "D"
END,
CASE
WHEN `visitor_score` > `home_score` THEN "W"
WHEN `visitor_score` < `home_score` THEN "L"
WHEN `visitor_score` = `home_score` THEN "D"
END
) != lastResult()
ORDER BY STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y") DESC
LIMIT 1
关于MySQL 计算胜/负数以找到连胜记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50945792/