mariadb 使用GROUP和SUBSELECT的计算未给出正确的值

azpvetkf  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个问题,从我的查询中获得正确计算的值...我有三张table:
表匹配:
| id| idEvent|地位|
| - -----|- -----|- -----|
| 一个|六|已完成|
| 2|六|已完成|
| 3|六|已完成|
第二桌玩家:
| idMatch| idPlayer|聚会|
| - -----|- -----|- -----|
| 一个|三十二|“0”|
| 一个|五十三|“0”|
| 一个|五十五|“一”|
| 一个|五十六|“一”|
| 2|八|“0”|
| 2|五十二|“0”|
| 2|五十四|“一”|
| 2|五十七|“一”|
| 3|八|“0”|
| 3|三十二|“0”|
| 3|五十四|“一”|
| 3|五十五|“一”|
表集:
| idMatch|指数|partySetWon|
| - -----|- -----|- -----|
| 一个|一个|“0”|
| 一个|2|“一”|
| 一个|3|“0”|
| 2|一个|“一”|
| 2| 2|“一”|
| 3|一个|“一”|
| 3| 2|“0”|
| 3| 3|“一”|
下面的查询抛出下面的输出:

SELECT 
    `match2player`.`idPlayer` AS 'Player',
    COUNT(DISTINCT `match`.`id`) AS 'Matches played',

    SUM(IF(`match2player`.`party`=
    (SELECT set1.`partySetWon` FROM `tennisdb`.`set` set1 WHERE set1.`idMatch` = `set`.`idMatch` GROUP BY set1.`partySetWon` ORDER BY COUNT(set1.`partySetWon`) DESC LIMIT 1)
    ,1,0)) AS 'Matches Won',
    
    SUM(IF(`match2player`.`party`=`set`.`partySetWon`, 1, 0)) AS 'Sets Won',
    SUM(IF(`match2player`.`party`<>`set`.`partySetWon`, 1, 0)) AS 'Sets lost'
FROM `tennisdb`.`set`
LEFT JOIN `tennisdb`.`match` ON `match`.`id` = `set`.`idMatch`
LEFT JOIN `tennisdb`.`match2player` ON `match2player`.`idMatch` = `set`.`idMatch`
WHERE `match`.`idEvent` = 6 AND `match`.`status` IN ('completed','awarded')
GROUP BY `match2player`.`idPlayer`
ORDER BY Player;

Player,"Matches played","Matches Won","Sets Won","Sets lost"
8,2,0,1,4
32,2,3,3,3
52,1,0,0,2
53,1,3,2,1
54,2,5,4,1
55,2,3,3,3
56,1,0,1,2
57,1,2,2,0

“赢得的比赛”一栏给出了错误的值(太高),我不知道如何解决...我玩了进一步的分组,窗口等,没有提供预期的结果......
预选赛将确定哪一方赢得了大多数盘,并导致比赛。当我在比赛中处于顶级小组时,这很好用(不仅仅是球员)。但我不是在寻找一个细分的个别比赛,我想得到的统计超过所有比赛...

s5a0g9ez

s5a0g9ez1#

分析内部查询中的匹配项,然后对集合求和,匹配项获胜和失败:

select idplayer, sum(case when setwon > setlost then 1 else 0 end) mwon,
       sum(case when setwon < setlost then 1 else 0 end) mlost,
       sum(setwon) swon, sum(setlost) slost
from (
  select mp.idmatch, idplayer, 
         sum(case party when partysetwon then 1 else 0 end) setwon,  
         sum(case party when partysetwon then 0 else 1 end) setlost  
  from match2player mp 
  join `set` s on s.idmatch = mp.idmatch 
  group by mp.idmatch, idplayer) grp
group by idplayer order by idplayer

dbfiddle demo

相关问题