MySQL 计算胜/负数以找到连胜记录

标签 mysql count phpmyadmin

我有一个包含体育比赛的表格,其中包含日期、球队和结果。我想找到一支球队目前的连胜或连败记录。

我的表格如下所示:

+------------+----------+---------+---------------+------+------------+
| 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个函数:

  1. retrieveLastResult (返回 W、L、D)
  2. retrieveLastGameDate (返回 date_month、date_day)
  3. 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/

相关文章:

mysql - 无法在 phpmyadmin 的 mysql 中创建触发器

mysql - 更改 "option file"my.ini 的 MySQL 路径

mysql - 带有两个外键的自然 JOIN

Mysql 查询日志不工作

excel - VBA Excel_比较和计数: Compare cells from two sheets and make a count for lateness

php - 如何从 phpmyadmin CURRENT_TIMESTAMP 获取小时和分钟

php - 查询在 phpMyAdmin 中有效,但不能通过 mysql_query

php - 内部加入后"Column ' id ' in where clause is ambiguous"?

php - MySQL 选择具有两个 where 条件且计数大于 1 且具有相同列 ID 的行

MySQL 计数该值是否之前没有出现过