所以我有两个表,播放机和结构,像这样匹配:汇总总计给出多个条件
Table "public.players"
Column | Type | Modifiers
--------+---------+------------------------------------------------------
id | integer | not null default nextval('players_id_seq'::regclass)
name | text |
wins | integer | default 0
loses | integer | default 0
rating | integer | default 1500
和
Table "public.matches"
Column | Type | Modifiers
---------------+---------+------------------------------------------------------
id | integer | not null default nextval('matches_id_seq'::regclass)
player1 | integer |
player1rating | integer |
player2 | integer |
player2rating | integer |
winner | boolean |
在哪里,如果PLAYER1赢得了那场比赛,或者如果player2假的赢家是真实的赢得了比赛。
使用球员表进行简单的赢/输比较很简单,但我正在观察比较两名球员相互面对对手的情况,以及他们对对方的记录。
所以我对我怎么会总结困惑,其中给出一个给定的球员可能被列为要么PLAYER1或player2条件: P1胜率:
(player1 = <player1> AND winner = true) OR (player2 = <player1> AND winner = false)
P2胜率:
(player1 = <player2> AND winner = true) OR (player2 = <player2> AND winner = false)
损失只会与其他玩家获胜相反。
东西返回的信息,如:
id | name | wins | loses | rating | wins_v_opp | loses_v_opp
------+----------+------+-------+--------+------------+------------
4200 | Sinku | 5 | 48 | 1191 | 1 | 4
4201 | Kenshiro | 33 | 29 | 1620 | 4 | 1
我想出什么样的主意UPDATE2低于前:
CREATE FUNCTION matchup(text, text) AS $$
DECLARE
player1_name ALIAS FOR $1;
player2_name ALIAS FOR $2;
BEGIN
EXECUTE 'SELECT id FROM player WHERE name LIKE $1'
INTO player1_id
USING player1_name;
IF NOT FOUND THEN
RAISE EXCEPTION 'Player1 % not found', player1_name;
END IF;
EXECUTE 'SELECT id FROM player WHERE name LIKE $1'
INTO player2_id
USING player2_name;
IF NOT FOUND THEN
RAISE EXCEPTION 'Player2 % not found', player2_name;
END IF;
RETURN QUERY EXECUTE 'WITH cte_winners AS (
SELECT
CASE WHEN winner THEN m.player1 ELSE m.player2 END AS player,
COUNT(*) AS wins_v_opp,
sum(count(*)) over() - COUNT(*) AS loses_v_opp
FROM matches AS m
WHERE player1 IN ($1,$2) AND player2 IN ($1,$2)
GROUP BY player
)
SELECT * FROM players AS p
LEFT OUTER JOIN cte_winners AS cw ON cw.player = p.id WHERE p.id IN ($1,$2)'
USING player1_id,player2_id;
END;
$$ LANGUAGE plpgsql;
我就更新了原来的职位:) – OverlordQ
@OverlordQ您的评论还没有完成:) –
现在$ 10,000的问题是,如果我不知道前面的玩家ID我想按名称选择,我不需要加入CTE的球员吗? – OverlordQ