我发现在MySQL中创建视图非常困难,希望有人能帮助我.这是我的数据库的模式:

CREATE DATABASE football;

CREATE TABLE `team` (
  `name` varchar(15) PRIMARY KEY NOT NULL
  );
  
CREATE TABLE `season` (
   `name` char(9) PRIMARY KEY NOT NULL,
   `begin` date,
   `end` date);

CREATE TABLE `game` (
  `id` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `Date` date DEFAULT NULL,
  `HomeTeam` varchar(15) NOT NULL,
  `AwayTeam` varchar(15) NOT NULL,
  `FTHG` int DEFAULT NULL,           (full time home goal)
  `FTAG` int DEFAULT NULL,           (full time away goal)
  `FTR` char(1) DEFAULT NULL,
  `HTHG` int DEFAULT NULL,
  `HTAG` int DEFAULT NULL,     
  `HTR` char(1) DEFAULT NULL,
  `H_S` int DEFAULT NULL,
  `A_S` int DEFAULT NULL,
  `HST` int DEFAULT NULL,
  `AST` int DEFAULT NULL,
  `HC` int DEFAULT NULL,
  `AC` int DEFAULT NULL,
  `HF` int DEFAULT NULL,
  `AF` int DEFAULT NULL,
  `HY` int DEFAULT NULL,
  `AY` int DEFAULT NULL,
  `HR` int DEFAULT NULL,
  `AR` int DEFAULT NULL,
  `season` char(9),
  FOREIGN KEY (HomeTeam) REFERENCES team(name),
  FOREIGN KEY (AwayTeam) REFERENCES team(name),
  FOREIGN KEY (season) REFERENCES season(name),
  CHECK (HomeTeam != AwayTeam)
);

这个数据库收集了一系列的足球比赛和每一场比赛的许多特征,以及所有的球队和赛季.

CREATE VIEW stats AS 
    (SELECT season,team,sum(TGS) TGS,sum(TGC) TGC,sum(pts) pts 
    FROM (SELECT season, HomeTeam team, FTHG TGS, FTAG TGC, 
    CASE WHEN FTHG > FTAG THEN 3 WHEN FTHG=FTAG THEN 1 ELSE 0 END pts 
    FROM game UNION ALL SELECT season, AwayTeam team, FTAG TGS, FTHG TGC, 
    CASE WHEN FTAG > FTHG THEN 3 WHEN FTAG=FTHG THEN 1 ELSE 0 END pts FROM game) games 
    GROUP BY season,team);

其结果如下:

SELECT * FROM stats;

View列依次为:赛季、eam、TGS(球队得分)、TGC(球队失球)

这很好,但我现在需要的是生成排名.理想情况下,我希望有如下内容:

Team,19,18,17,16,15,14        (years)
Juventus,1,1,1,1,1,1          (came first each year)
Inter,2,4,4,7,4,8
Atalanta,3,3,7,4,13,17
Lazio,4,8,5,5,8,3
Roma,5,6,3,2,3,2
Milan,6,5,6,6,7,10
Napoli,7,2,2,3,2,5
Sassuolo,8,11,11,10,6,12
Verona,9,,19,,,13

一个主要的困难是,正如你所看到的,排名是从第14年(2014-2015赛季)开始的.因此,数据库中不存在该数据.虽然这是一件坏事,但有可能在视图中对其进行硬编码吗?我总是需要每场比赛前一年的数据,所以添加旧游戏只会重现问题...

Note

我知道db struct 可能不是最好的,但我现在必须坚持下go ...

推荐答案

为什么不在当前视图中计算每个球队/赛季的排名呢.现在,你可以根据需要加入任何级别(以及任何季节)的行列.

如果您需要上一年的排名,我们可以在后续表达式中使用LAG来实现这一点,或者只是基于与该年相关的一些表达式进行连接.

请注意 Select 列表中的RANK表达式.

The fiddle

建议(针对MySQL 8.0+):

CREATE VIEW stats AS
  SELECT season, team
       , sum(TGS) TGS, sum(TGC) TGC, sum(pts) pts
       , RANK() OVER (PARTITION BY season ORDER BY SUM(pts) DESC) AS rnk
    FROM (
           SELECT season, HomeTeam team, FTHG TGS, FTAG TGC
                , CASE WHEN FTHG > FTAG THEN 3 WHEN FTHG = FTAG THEN 1 ELSE 0 END pts
             FROM game
            UNION ALL
           SELECT season, AwayTeam team, FTAG TGS, FTHG TGC
                , CASE WHEN FTAG > FTHG THEN 3 WHEN FTAG = FTHG THEN 1 ELSE 0 END pts
             FROM game
         ) games
   GROUP BY season, team
;

Mysql相关问答推荐

如何有效地计算共同的朋友/追随者?

MySQL问题难以将文本字符串转换为正确的日期格式

MySQL查询获取图书的唯一读取页面数

拒绝非超级用户访问停靠的MariaDB(超级用户工作)

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

Ballerina SQL 中是否也应该考虑输入清理?

使用 awk 重写 maxscale 过滤器

外部磁盘上的MySQL表空间和数据文件

为什么Mysql会根据查询参数改变查询执行计划?

使用 SELECT 时应锁定多少行 .. FOR UPDATE LIMIT 1

如何获取每日登录用户数?

如何在 MySQL 中使用从 SELECT IF 返回的布尔值

有人可以帮我用 R 编程解决这个问题吗?

Mysql Pivot 查询/建议

SQL 根据多行值获取记录

使用 MySQL 在树中查找 Leaf

MySQL中两个时间字段的分钟差

最好的 MySQL 性能调优工具?

MySQL Workbench 无法加载 mysql.proc

如何在 python 中逐行获取 MySQL ResultSet