修改 MySQL 查询以生成正确的数据

Modify MySQL query to produce to right data

我正在尝试从足球中生成数据 table。

下面可以看到table,需要的数据被高亮显示。

需要制作的数据见下图。

现在我已经用了几天了,虽然离期望的输出还很远,但我已经取得了一些进展。这是我目前的查询。

SET @rownum := 0;
SELECT (@rownum := @rownum + 1) as matchNo,
(SELECT
 CASE 
    WHEN home_score > away_score AND home_team_name ='Barcelona' THEN 3
    WHEN home_score < away_score AND away_team_name = 'Barcelona' THEN 3
    WHEN home_score > away_score AND away_team_name = 'Barcelona' THEN 0
    WHEN home_score < away_score AND home_team_name = 'Barcelona' THEN 0
    WHEN home_score = away_score AND home_team_name = 'Barcelona' THEN 1
    WHEN home_score = away_score AND away_team_name = 'Barcelona' THEN 1
    END) AS outcome,
(SELECT SUM(outcome) / 3) AS winrate
FROM matches
ORDER BY matches.match_id

我得到的结果如下

我想做的是将 winrate 作为第二个字段,将 outcome 作为最后一个字段,显然得到了正确的胜率。提前谢谢大家。

这是我使用的数据集(以后请用文字代替图片,不能是copy/pasted):

CREATE TABLE matches ( 
    match_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    home_team_name VARCHAR(30) NOT NULL,
    away_team_name VARCHAR(30) NOT NULL,
    home_score INT NOT NULL,
    away_score INT NOT NULL
); 

INSERT INTO matches (match_id, home_team_name, away_team_name, home_score, away_score) VALUES
(123, "Barcelona", "Paris", 3, 0),
(124, "Barcelona", "Milan", 2, 2),
(125, "Madrid", "Paris", 1, 1),
(126, "Milan", "Madrid", 1, 2),
(127, "Barcelona", "Madrid", 2, 0),
(128, "Milan", "Paris", 3, 4),
(201, "Paris", "Barcelona", 0, 0),
(202, "Paris", "Milan", 1, 2),
(203, "Paris", "Madrid", 2, 3),
(204, "Madrid", "Barcelona", 2, 3),
(205, "Madrid", "Milan", 3, 1),
(206, "Milan", "Barcelona", 2, 0);

您需要更多的计算才能获得胜率,就像您一样使用更多的计数器。此请求将计算胜利和分数的总数和平均值:

SELECT
    @rownum := @rownum + 1 as matchNo,
    @rowvictory := (SELECT
     CASE 
        WHEN home_score > away_score AND home_team_name ='Barcelona' THEN 1
        WHEN home_score < away_score AND away_team_name = 'Barcelona' THEN 1
        ELSE 0
        END) AS victory,
    @rowpoints := (SELECT
     CASE 
        WHEN home_score > away_score AND home_team_name ='Barcelona' THEN 3
        WHEN home_score < away_score AND away_team_name = 'Barcelona' THEN 3
        WHEN home_score > away_score AND away_team_name = 'Barcelona' THEN 0
        WHEN home_score < away_score AND home_team_name = 'Barcelona' THEN 0
        WHEN home_score = away_score AND home_team_name = 'Barcelona' THEN 1
        WHEN home_score = away_score AND away_team_name = 'Barcelona' THEN 1
        END) AS points,
    (SELECT @points := @points + @rowpoints) as total_points,
    (SELECT @points / @rownum) AS average_points,
    (SELECT @victories := @victories + @rowvictory) as total_victories,
    (SELECT @victories / @rownum) AS average_victories
FROM matches
JOIN (SELECT @rownum := 0) AS rownum
JOIN (SELECT @points := 0) AS points
JOIN (SELECT @victories := 0) AS victories
WHERE home_team_name = 'Barcelona'
OR away_team_name = 'Barcelona'

-- matchNo  victory points total_points average_points total_victories average_victories
-- 1        1       3      3            3              1               1
-- 2        0       1      4            2              1               0.5
-- 3        1       3      7            2.33           2               0.66
-- 4        0       1      8            2              2               0.5
-- 5        1       3      11           2.2            3               0.6
-- 6        0       0      11           1.83           3               0.5

现在您可以简单地将其包装在另一个查询中,以按照您想要的顺序获取您想要的列:

SELECT matchNo, average_victories AS winrate, points AS outcome
FROM (
    SELECT
        @rownum := @rownum + 1 as matchNo,
        @rowvictory := (SELECT
         CASE 
            WHEN home_score > away_score AND home_team_name ='Barcelona' THEN 1
            WHEN home_score < away_score AND away_team_name = 'Barcelona' THEN 1
            ELSE 0
            END) AS victory,
        @rowpoints := (SELECT
         CASE 
            WHEN home_score > away_score AND home_team_name ='Barcelona' THEN 3
            WHEN home_score < away_score AND away_team_name = 'Barcelona' THEN 3
            WHEN home_score > away_score AND away_team_name = 'Barcelona' THEN 0
            WHEN home_score < away_score AND home_team_name = 'Barcelona' THEN 0
            WHEN home_score = away_score AND home_team_name = 'Barcelona' THEN 1
            WHEN home_score = away_score AND away_team_name = 'Barcelona' THEN 1
            END) AS points,
        (SELECT @points := @points + @rowpoints) as total_points,
        (SELECT @points / @rownum) AS average_points,
        (SELECT @victories := @victories + @rowvictory) as total_victories,
        (SELECT @victories / @rownum) AS average_victories
    FROM matches
    JOIN (SELECT @rownum := 0) AS rownum
    JOIN (SELECT @points := 0) AS points
    JOIN (SELECT @victories := 0) AS victories
    WHERE home_team_name = 'Barcelona'
    OR away_team_name = 'Barcelona'
) AS t

-- matchNo winrate  outcome
-- 1       1        3
-- 2       0.5      1
-- 3       0.66     3
-- 4       0.5      1
-- 5       0.6      3
-- 6       0.5      0