【发布时间】:2015-10-04 10:50:56
【问题描述】:
在此查询中,我必须列出为完全相同的球队效力的一对球员及其 playerID 和 playerName。如果一名球员为 3 支球队效力,则另一个球员必须为完全相同的 3 支球队效力。不多,不多。如果两名球员目前没有为任何球队效力,他们也应该被包括在内。查询应返回 (playerID1, playername1, playerID2, playerName2) 且不重复,例如如果玩家 1 信息在玩家 2 之前,则不应有另一个元组包含玩家 2 信息在玩家 1 之前。
例如,如果球员 A 为洋基队和红袜队效力,而球员 b 为洋基队、红袜队和道奇队效力,我就不应该得到他们。他们都必须为洋基队和红袜队效力,而没有其他人。现在,如果球员为同一支球队效力,这个查询可以找到答案。
Tables:
player(playerID: integer, playerName: string)
team(teamID: integer, teamName: string, sport: string)
plays(playerID: integer, teamID: integer)
Example data:
PLAYER
playerID playerName
1 Rondo
2 Allen
3 Pierce
4 Garnett
5 Perkins
TEAM
teamID teamName sport
1 Celtics Basketball
2 Lakers Basketball
3 Patriots Football
4 Red Sox Baseball
5 Bulls Basketball
PLAYS
playerID TeamID
1 1
1 2
1 3
2 1
2 3
3 1
3 3
所以我应该得到这个答案-
2, Allen, 3, Pierce
4, Garnett, 5, Perkins
.
2, Allen, 3 Pierce 是个不错的选择,因为他们都只为凯尔特人和爱国者队效力 4,加内特,5,帕金斯是一个答案,因为这两名球员都没有为应该输出的球队效力。
现在我的查询是
SELECT p1.PLAYERID,
f1.PLAYERNAME,
p2.PLAYERID,
f2.PLAYERNAME
FROM PLAYER f1,
PLAYER f2,
PLAYS p1
FULL OUTER JOIN PLAYS p2
ON p1.PLAYERID < p2.PLAYERID
AND p1.TEAMID = p2.TEAMID
GROUP BY p1.PLAYERID,
f1.PLAYERID,
p2.PLAYERID,
f2.PLAYERID
HAVING Count(p1.PLAYERID) = Count(*)
AND Count(p2.PLAYERID) = Count(*)
AND p1.PLAYERID = f1.PLAYERID
AND p2.PLAYERID = f2.PLAYERID;
我不是 100% 确定,但我认为这可以找到为同一支球队效力的球员,但我想找出为上述所有相同球队效力的球员
在此之后我被困在如何处理它上。有关如何解决此问题的任何提示。谢谢你的时间。
【问题讨论】:
-
我了解到您希望找到 2 名球员在完全相同的球队中比赛。你能澄清一下“不重复”是什么意思吗?
-
您使用的是什么 DBMS?
-
一名球员可以为多支球队效力。我想要为同一支球队效力的球员。假设球员 A 为公牛队、魔术队、凯尔特人队效力,球员 B 为公牛队、魔术队、凯尔特人队、热火队效力。他们不算数,因为热火队不是 A 为之效力的团队成员。我想找到两个为完全相同的球队效力的不同球员,仅此而已。此外,如果两名球员目前不为任何球队效力,这是可能的。它们应该在输出中。另一件事,假设 A 队和 B 队比赛。输出应该是 A、B 或 B、A,而不是两者。如果还有任何问题,请告诉我。
-
我正在使用 SQL 在 postgres 上执行此操作。
-
您的联接完全错误。您不应该将 having 子句中的隐式连接与 from 子句中的显式
JOINs 混合使用(如果有的话:隐式连接应该在WHERE子句中完成
标签: sql postgresql