【问题标题】:How do i join these two PSQL queries together correctly?如何正确地将这两个 PSQL 查询连接在一起?
【发布时间】:2017-02-24 11:30:09
【问题描述】:

我正在尝试返回一个查询,该查询将显示玩家在游戏中玩了多少次以及他/她赢了多少次。这就是我目前所拥有的,停留在最后一个连接查询上

链接到我的 SQL 小提琴: http://sqlfiddle.com/#!15/46b2a/52

我有两张桌子:

CREATE TABLE player(
id serial PRIMARY KEY NOT NULL,
name varchar(255) NOT NULL
);

CREATE TABLE match(
id serial PRIMARY KEY,
winner serial REFERENCES player(id) NOT NULL,
loser serial REFERENCES player(id) NOT NULL CHECK (loser != winner)
);

CREATE SEQUENCE playerid_sequence 
start 1
increment 1;

CREATE SEQUENCE matchid_sequence
start 1
increment 1;

我用一些插入示例填充了我的表格:

--Player Insertion 
INSERT INTO player VALUES(nextval('playerid_sequence'), 'Kevin');
INSERT INTO player VALUES(nextval('playerid_sequence'), 'Dennis');
INSERT INTO player VALUES(nextval('playerid_sequence'), 'George');
INSERT INTO player VALUES(nextval('playerid_sequence'), 'Michael');

--Match Insertion
INSERT INTO match VALUES(nextval('matchid_sequence'), 1, 2);
INSERT INTO match VALUES(nextval('matchid_sequence'), 1, 3);
INSERT INTO match VALUES(nextval('matchid_sequence'), 1, 4);
INSERT INTO match VALUES(nextval('matchid_sequence'), 2, 3);

我创建了两个 SQL 查询:

--How many did a player win?
SELECT player.id, player.name, count(player.name) as wins FROM player, match 
WHERE player.id = match.winner GROUP by player.name, player.id ORDER BY wins DESC;

--How many matches did a particular player participate in?
SELECT player.id, player.name, count(player.name) as matches_played
FROM player, match
WHERE player.id = match.winner OR player.id = match.loser 
GROUP by player.name, player.id
ORDER by matches_played DESC;

我尝试加入他们:

SELECT 
* 
FROM
(SELECT player.id, player.name, count(player.name) as wins FROM player, match 
WHERE player.id = match.winner GROUP by player.name, player.id ORDER BY wins DESC) t1 
FULL OUTER JOIN
(SELECT player.id as id, count(player.name) as matches_played
FROM player, match
WHERE player.id = match.winner OR player.id = match.loser 
GROUP by player.id
ORDER by matches_played DESC) t2
ON t1.id = t2.id;

上面的join查询只返回t1的玩家集合,而我希望它返回t2的所有玩家。

我想要: 玩家ID|姓名|胜出|所有玩家的总比赛数,如果他们没有获胜,则获胜列中为 0。

我有:

 id name    wins    id  matches_played
 1  Kevin   3       1    3
 2  Dennis  1       2    2
 (null) (null)  (null)  4   1
 (null) (null)  (null)  3   2

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我认为查询可以简化为:

    select p.id, p.name,
           count(case when m.winner = p.id then 'X' end) as wins,
           count(m.id) as matches_played
      from player p
      left join match m
        on m.winner = p.id or m.loser = p.id
     group by p.id, p.name;
    

    SQL Fiddle Demo

    关键是您要在match 表上左连接。剩下的就是简单的条件聚合。

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多