SQLite中如何找到比赛中选择次数最多的冠军

How to find the champion with the highest number of selections in match in SQLlite

我正在尝试执行此查询:为找到的每个冠军找到在比赛中选择次数最多的冠军,显示他们的名字以及他们在比赛中 ha\ve 被选中的次数。

这是表格:

 CREATE TABLE champions
    (
        id_champion INT PRIMARY KEY NOT NULL,
        name VARCHAR(20),
        title VARCHAR(20),
        attack INT,
        defense INT,
        magic INT,
        difficulty INT
    );
    
    CREATE TABLE players
    (
        id_player INT PRIMARY KEY NOT NULL,
        name VARCHAR(20),
        country VARCHAR(20)
    );
    
    CREATE TABLE matchs
    (
        id_match INT,
        player INT,
        champion INT,
        number INT,
        gold INT,
        team INT,
        position VARCHAR(10),
        PRIMARY KEY (id_match, player),
        FOREIGN KEY(id_match) REFERENCES matchsmeta(id_match) ON DELETE SET NULL,
        FOREIGN KEY(player) REFERENCES players(id_player) ON DELETE SET NULL,
        FOREIGN KEY(champion) REFERENCES champions(id_champion) ON DELETE SET NULL
    
    );
    
    CREATE TABLE matchsmeta
    (
        id_match INT PRIMARY KEY NOT NULL,
        time INT,
        victory INT,
        date DATE,
        game_mode VARCHAR(10)
    );

你必须计算冠军出现在比赛中的次数table。 然后就可以加入冠军table拿名字了

SELECT
m.champion,
c.name,
SUM(1) as num_times_picked
FROM matchs m
LEFT JOIN champions c on (m.champion = c.id_champion)
GROUP BY m.champion
ORDER BY 3 DESC

首先在 table matchs 中聚合以获得每个冠军被选中的次数,然后使用 MAX() window 函数获取这些计数的最大值:

SELECT champion, 
       COUNT(*) counter,
       MAX(COUNT(*)) OVER () max_counter
FROM matchs 
GROUP BY champion

然后将上面的查询加入table champions:

SELECT c.name, m.counter
FROM champions c 
INNER JOIN (
  SELECT champion, 
         COUNT(*) counter,
         MAX(COUNT(*)) OVER () max_counter
  FROM matchs 
  GROUP BY champion
) m ON m.champion = c.id_champion
WHERE m.counter = m.max_counter;