所以我有一些我想弄清楚的代码......我有两张桌子:
表:匹配
event_id
match_id (primary)
match_score
match_p1
match_p2
match_win
表:结果
event_id
user_id
result_id (primary)
result_name
result_extra
关于数据的奇怪之处在于匹配表的内容实际上以多种方式链接到结果表。
match_p1
和match_p2
中会有一个整数,它会链接到结果表中的results_extra
字段。这是因为每场比赛都有两名球员(p1和p2),每位球员每场比赛都有一个结果。
如果我想获得一个事件中所有匹配的列表,我会执行以下操作:
SELECT *
FROM matches
WHERE event_id = 324
如果我想获得属于单个玩家的所有比赛的列表,我会这样做:
SELECT matches.*
FROM matches
LEFT JOIN results
ON ((results.result_extra = matches.match_p1) OR
(results.result_extra = matches.match_p2))
WHERE results.user_id = 1566
然而,这是事情变得有点复杂的地方......如果我想得到一个匹配列表,其中玩家1566
与玩家2058
进行了战斗怎么办?它是我无法弄清楚的这个查询的逻辑。你能帮助我吗?
答案 0 :(得分:1)
可能是这个
SELECT matches.*
FROM matches
LEFT JOIN results a
ON ((a.result_extra = matches.match_p1 AND
a.result_extra = matches.match_p2))
LEFT JOIN results b
ON ((b.result_extra = matches.match_p1 AND
b.result_extra = matches.match_p2))
WHERE a.user_id = 2058
AND b.user_id = 1566
答案 1 :(得分:1)
这是一种方法。加入results
两次,并匹配2个玩家组合。
select a.*
from matches a
join results b on a.match_p1 = b.result_extra
join results c on a.match_p2 = c.result_extra
where (b.user_id = 1566 and c.user_id = 2058) or (b.user_id = 2058 and c.user_id = 1566)
答案 2 :(得分:0)
如果1566和2059是user_ids,也许这可以帮助您
SELECT matches.*
FROM matches
LEFT JOIN results
ON ((results.result_extra = matches.match_p1) OR
(results.result_extra = matches.match_p2))
WHERE results.user_id in (1566,2058);