mysql查询多对多关系中的匹配

时间:2016-06-06 18:39:40

标签: mysql

我需要构建一个复杂的查询,我甚至不知道从哪里开始。欢迎任何帮助。

我有一个用户表和一个游戏表,它们之间有2对多关系,表和相关列是:

  • 用户:id
  • 游戏:id
  • game_users_A:id,user_id,game_id。 (关系)
  • game_users_B:id,user_id,game_id。 (B关系)

假设我选择了一个用户和一个关系,例如user1,关系A. 我希望得到其他所有用户,并根据他们B关系中的游戏数量与user1的A关系中的游戏进行排序。

感谢。我一直试图找到类似的问题,但我甚至不知道如何打电话给我正在尝试做的事情。

修改

感谢Hayden的帮助,我能够构建我需要的查询。 我只需要适应他一点:

他的查询将每个用户相互比较。这比我需要做的要多得多,大约3000个用户将返回超过900000行。 我只需要将登录到我的应用程序的用户与数据库中的每个其他用户进行比较,因此对于N个用户,我将获得N - 1行。

所以我刚刚添加了几个WHERE clouses并更改了ORDER BY。

假设用户发出请求的ID为3,并希望看到用户在A关系中与游戏中的游戏匹配(而不是相反),这就是查询:

SELECT U1.id, U2.id, SUM(GCol) AS matches
FROM users U1 JOIN users U2 ON U1.id <> U2.id
LEFT JOIN (SELECT A.user_id AS A_id, B.user_id as B_id, (A.id IS NOT NULL) AS GCol
FROM game_users_A A JOIN game_users_B B
ON A.game_id = B.game_id AND A.user_id <> B.user_id WHERE A.user_id = 3) G
ON U1.id = G.A_id AND U2.id = G.B_id
WHERE U1.id = 3
GROUP BY GCol, U1.id, U2.id
ORDER BY matches desc

再次感谢。

1 个答案:

答案 0 :(得分:0)

我玩了一些带有这些表的测试数据库,这就是我所拥有的。

我将其分解为两个查询。第一个是将所有用户与所有其他用户匹配,这只是:

fmap (const old)

第二个查询是将B组中的记录与A组中的记录相匹配,其中游戏是相同的。这给了我:

SELECT U1.id, U2.id 
FROM users U1 JOIN users U2 ON U1.id <> U2.id
ORDER BY U1.id, U2.id

要结合这两个,我对第二个查询进行了第一个查询的左连接,因为对于任何一对用户,可能没有匹配的游戏集。在这些情况下,第二个查询的结果将显示为NULL值。我们想要的是当它们出现时值为1,所以如果你查看下面的查询,那么值为

SELECT A.user_id AS A_id, B.user_id as B_id
FROM game_users_A A JOIN game_users_B B
ON A.game_id = B.game_id AND A.user_id <> B.user_id

使用,所以我们可以找到总和。如果有记录,则值为1,否则为NULL。当那里没有值时,总数仍为空,但是当存在匹配时,总计并显示总数。这给出了最终查询:

(A.id IS NOT NULL) AS GCol

我认为这就是你要找的东西。