gpt4 book ai didi

mysql - 具有多个条件OR/AND的SQL连接不起作用

转载 作者:行者123 更新时间:2023-11-29 03:33:14 24 4
gpt4 key购买 nike

我正在尝试基于具有多个条件或/和的左连接构建视图。这是多个堆栈视图的第一个视图之一,这些视图计算了3v3格式的集合匹配的神奇排名。
我已经成功地为2V2格式构建了相同的视图,我正在尝试为3v3复制它,但它不起作用。
小上下文:我们是6个朋友的兄弟会。我们经常在一起玩,但很少有人在一起。我们根据在场的玩家数量调整游戏格式。如果我们是一个未配对的号码,我们将单打独斗(1对全部),如果我们配对,我们通常在团队中(2V2或3V3),但我们也可以单打独斗对其他3或5名球员。每种格式有16种不同的游戏格式(1V1,Solo 3P,Solo 4P,2V2等等),所有的排名都是由MySQL从堆叠的SQL视图中计算出来的。当我们在队中比赛时,我们随机组建两个队。因此,在团队形式中,可以有多个团队组合,但只能有一个限制的数字,因为除了6名球员之外,不能有其他人。
为了建立2V2和3V3排名,我构建了两个视图,从players表中计算出所有可能的团队组合,如下所示:
2v2团队组合:

  P1          P2
Bastien Charles
Bastien Francois
Charles Francois
Bastien Mathieu
Charles Mathieu
Francois Mathieu
Bastien Thomas
Charles Thomas
Francois Thomas
Mathieu Thomas
Bastien Valery
Charles Valery
Francois Valery
Mathieu Valery
Thomas Valery

3V3梁组合:
  P1        P2        P3
Bastien Charles Francois
Bastien Charles Mathieu
Bastien Francois Mathieu
Charles Francois Mathieu
Bastien Charles Thomas
Bastien Francois Thomas
Charles Francois Thomas
Bastien Mathieu Thomas
Charles Mathieu Thomas
Francois Mathieu Thomas
Bastien Charles Valery
Bastien Francois Valery
Charles Francois Valery
Bastien Mathieu Valery
Charles Mathieu Valery
Francois Mathieu Valery
Bastien Thomas Valery
Charles Thomas Valery
Francois Thomas Valery
Mathieu Thomas Valery

首先,这是以2V2格式收集每队所有胜利(胜利)的视图,它按预期工作(注意“jouer”在法语中是“Player”的意思)
select C.P1 AS Joueur1,C.P2 AS JOueur2,count(0) AS Twin,sum(P.Win) AS Pwin 
from MTG_Matchs M
join MTG_Matchs_Formats F on M.Format = F.Format
join VIEW_Matchs_Formats_Points P on P.Format = F.Format
left join MTG_Matchs_Joueurs J1 on (J1.MatchID = M.ID and J1.Num = 1)
left join MTG_Matchs_Joueurs J2 on (J2.MatchID = M.ID and J2.Num = 2)
left join VIEW_Equipes_Combinaisons_2 C on
((C.P1 = J1.Joueur) and (C.P2 = J2.Joueur))
or ((C.P2 = J1.Joueur) and (C.P1 = J2.Joueur))
where ((F.IsTeam = 1)
and (F.NbrJoueurs = 4)
and (J1.Team = J2.Team)
and (J2.Win = 1)
and (J1.Win = 1))
group by C.P1,C.P2

返回的结果(比赛表中所有球队的组合,以及赢得的总胜利和总积分):
Joueur1     JOueur2     Twin    Pwin
Charles Francois 5 150
Francois Thomas 11 330
Francois Mathieu 7 210
Mathieu Thomas 7 210
Bastien Charles 2 60
Bastien Thomas 5 150
Charles Thomas 7 210
Charles Mathieu 8 240
Francois Valery 2 60

此查询的关键是在2v2 combinations表上进行的连接:left join VIEW_Equipes_combinations_2c
既然这样很好,我想为3v3重现同样的逻辑
在数据库中只有5个3v3匹配,有4个不同的团队组合。
以下是3v3 Match的Match_Jouers表中的所有记录:
select  J.*
from MTG_Matchs M
join MTG_Matchs_Formats F on (M.Format = F.Format)
left join MTG_Matchs_Joueurs J on J.MatchID = M.ID
where (F.IsTeam = 1)
and (F.NbrJoueurs = 6)

ID MatchID Num Team Joueur Deck Score Win
20 5 1 2 Bastien 207 0 0
18 5 2 1 Charles 144 5 1
22 5 3 2 Francois 203 0 0
19 5 3 1 Mathieu 222 0 1
17 5 1 1 Thomas 208 8 1
21 5 2 2 Valery 194 0 0
28 6 3 2 Bastien 207 10 1
23 6 1 1 Charles 144 0 0
27 6 2 2 Francois 203 10 1
25 6 3 1 Mathieu 222 0 0
24 6 2 1 Thomas 209 0 0
26 6 1 2 Valery 194 20 1
34 7 3 2 Bastien 154 0 0
29 7 1 1 Charles 144 20 1
33 7 2 2 Francois 200 0 0
31 7 3 1 Mathieu 222 0 1
30 7 2 1 Thomas 209 8 1
32 7 1 2 Valery 194 0 0
496 146 3 1 Bastien 222 0 1
499 146 3 2 Charles 154 0 0
495 146 2 1 Francois 209 8 1
494 146 1 1 Mathieu 144 20 1
498 146 2 2 Thomas 200 0 0
497 146 1 2 Valery 194 0 0
502 147 3 1 Bastien 222 0 0
505 147 3 2 Charles 154 0 1
501 147 2 1 Francois 209 0 0
500 147 1 1 Mathieu 144 0 0
504 147 2 2 Thomas 200 0 1
503 147 1 2 Valery 194 0 1

以下查询以3v3格式列出了赢得比赛的所有球队(3名球员),我将其发布,以便您能够理解3v3视图应返回的数据:
select J1.Joueur, J2.Joueur, J3.Joueur 
from MTG_Matchs M
join MTG_Matchs_Formats F on (M.Format = F.Format)
join VIEW_Matchs_Formats_Points P on P.Format = F.Format
left join MTG_Matchs_Joueurs J1 on ((J1.MatchID = M.ID) and (J1.Num = 1))
left join MTG_Matchs_Joueurs J2 on ((J2.MatchID = M.ID) and (J2.Num = 2))
left join MTG_Matchs_Joueurs J3 on ((J3.MatchID = M.ID) and (J3.Num = 3))
where (F.IsTeam = 1)
and (F.NbrJoueurs = 6)
and (J1.Team = J2.Team)
and (J2.Team = J3.Team)
and (J1.Win = 1)
and (J2.Win = 1)
and (J3.Win = 1)

它给出:
   Joueur    Joueur    Joueur
#1 Charles Thomas Mathieu
#2 Valery Francois Bastien
#3 Valery Thomas Charles
#4 Thomas Charles Mathieu
#5 Mathieu Francois Bastien

注意,有5个返回行,但它们只代表4个组合,因为第1行和第4行是相同的组合,但玩家的顺序不同。这正是为什么团队组合视图上的正确连接是产生一致结果的关键。
最后,这里的观点是,应该收集所有的胜利(胜利),每队和3V3格式,并计算胜利的数量和赢得的积分。我复制了与2v2视图完全相同的逻辑:
select C.P1 AS Joueur1, C.P2 AS Joueur2, C.P3 AS Joueur3, count(0) AS Twin, sum(P.Win) AS Pwin 
from MTG_Matchs M
join MTG_Matchs_Formats F on (M.Format = F.Format)
join VIEW_Matchs_Formats_Points P on P.Format = F.Format
left join MTG_Matchs_Joueurs J1 on ((J1.MatchID = M.ID) and (J1.Num = 1))
left join MTG_Matchs_Joueurs J2 on ((J2.MatchID = M.ID) and (J2.Num = 2))
left join MTG_Matchs_Joueurs J3 on ((J3.MatchID = M.ID) and (J3.Num = 3))
left join VIEW_Equipes_Combinaisons_3 C
on (
((C.P1 = J1.Joueur) and (C.P2 = J2.Joueur) and (C.P3 = J3.Joueur))
or ((C.P2 = J1.Joueur) and (C.P3 = J2.Joueur) and (C.P1 = J3.Joueur))
or ((C.P3 = J1.Joueur) and (C.P1 = J2.Joueur) and (C.P2 = J3.Joueur))
)
where (F.IsTeam = 1)
and (F.NbrJoueurs = 6)
and (J1.Team = J2.Team)
and (J2.Team = J3.Team)
and (J1.Win = 1)
and (J2.Win = 1)
and (J3.Win = 1)
group by C.P1,C.P2, C.P3

返回的结果不完整且不正确:
Joueur1   Joueur2   Joueur3  Twin      Pwin
NULL NULL NULL 4 160
Charles Mathieu Thomas 1 40

返回的结果应该类似于:
Joueur1   Joueur2   Joueur3  Twin      Pwin
Mathieu Francois Bastien 1 40
Valery Thomas Charles 1 40
Charles Mathieu Thomas 2 80
Bastien Valery Francois 1 40

显然,问题来自于3v3团队组合视图中的左连接。它应该为每种球队组合做出正确的连接,球员的顺序不同:
    left join VIEW_Equipes_Combinaisons_3 C 
on (
((C.P1 = J1.Joueur) and (C.P2 = J2.Joueur) and (C.P3 = J3.Joueur))
or ((C.P2 = J1.Joueur) and (C.P3 = J2.Joueur) and (C.P1 = J3.Joueur))
or ((C.P3 = J1.Joueur) and (C.P1 = J2.Joueur) and (C.P2 = J3.Joueur))
)

我不明白为什么这不管用。
如果你一直读到那里,并试图理解,我已经可以祝贺和感谢你:-)
这个问题很复杂,不容易总结。我试着把它保持短一点,它已经够长了。如果您没有足够的数据来理解这个问题(比如所有相关表的完整结构和每个表的数据样本),我可以提供它,但它将非常长。
编辑:尝试移动其各自联接的ON中的所有WHERE语句,但结果相同:
select C.P1 AS Joueur1, C.P2 AS Joueur2, C.P3 AS Joueur3, count(0) AS Twin, sum(P.Win) AS Pwin 
from MTG_Matchs M
join MTG_Matchs_Formats F on ((M.Format = F.Format) AND (F.IsTeam = 1) and (F.NbrJoueurs = 6))
join VIEW_Matchs_Formats_Points P on P.Format = F.Format
left join MTG_Matchs_Joueurs J1 on ((J1.MatchID = M.ID) and (J1.Num = 1) and (J1.Win = 1))
left join MTG_Matchs_Joueurs J2 on ((J2.MatchID = M.ID) and (J2.Num = 2) and (J2.Win = 1) AND (J1.Team = J2.Team))
left join MTG_Matchs_Joueurs J3 on ((J3.MatchID = M.ID) and (J3.Num = 3) and (J2.Win = 1) AND (J2.Team = J3.Team) )
left join VIEW_Equipes_Combinaisons_3 C
on (
((C.P1 = J1.Joueur) and (C.P2 = J2.Joueur) and (C.P3 = J3.Joueur))
or ((C.P2 = J1.Joueur) and (C.P3 = J2.Joueur) and (C.P1 = J3.Joueur))
or ((C.P3 = J1.Joueur) and (C.P1 = J2.Joueur) and (C.P2 = J3.Joueur))
)
group by C.P1,C.P2, C.P3

最佳答案

将右表条件从何处分别移到上。

关于mysql - 具有多个条件OR/AND的SQL连接不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27397101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com