MySQL计数获胜/失败找到连胜

时间:2018-06-20 10:16:34

标签: 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)

1 个答案:

答案 0 :(得分:0)

我不会抱怨您的表结构。 我认为您不能更改表结构。

  

我已经完成了按日期排序结果的操作。

您的解决方案很难看。考虑使用类似的东西:

SELECT STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y") AS date

请注意,由于年份是STR_TO_DATE函数中的必需项,因此我必须使用YEAR(CURDATE()),似乎您没有存储游戏的年份。 现在,您可以简单地: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() 

retrieveLastResult函数

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

retrieveLastGameDate函数

SELECT STR_TO_DATE(CONCAT(date_month, date_day, YEAR(CURDATE())),"%M%d%Y") as date
FROM schedule
ORDER BY date
LIMIT 1

retrieveFirstResultDateDifferentFromLastOne函数

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