在MySQL查询中获取两个匹配项?

时间:2016-06-26 21:16:05

标签: mysql sql

所以我有一些我想弄清楚的代码......我有两张桌子:

表:匹配

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_p1match_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进行了战斗怎么办?它是我无法弄清楚的这个查询的逻辑。你能帮助我吗?

3 个答案:

答案 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);