【问题标题】:Get rows that have common value from the same table with different id从具有不同id的同一个表中获取具有共同值的行
【发布时间】:2018-06-12 14:51:17
【问题描述】:

我刚刚查看了这个question,但我需要的是完全不同的东西。

但是,我有这张桌子:

team_players_order 
    (team_id, 
    player_id, 
    ordering, 
    captain
    )

该表存储了球队 ID 列表以及属于每个球队的球员 ID(每个球队可以有 0-15 名球员)。我想得到的是有共同球员的球队。

我想要比较的团队列表可能是已知的(我有他们的 id)或未知的,那么我可能需要搜索整个表格并比较所有团队。 .

这是三个团队的示例数据:

        team_id    player_id  ordering   captain    
        117        134        0          N          
        117        55         1          N          
        117        97         2          N          
        117        215        3          N          
        117        165        4          N          
        117        221        5          N          
        117        163        6          N          
        117        128        7          N     >> common player     
        117        180        8          N          
        117        96         9          N          
        117        162        10         N          
        117        88         11         N          
        117        229        12         N          
        117        91         13         N          
        117        105        14         N    
    -----------------------------------------------      
        124        88         0          N          
        124        165        1          N          
        124        92         2          N          
        124        130        3          N          
        124        47         4          N          
        124        221        5          N          
        124        30         6          N          
        124        223        7          N          
        124        105        8          Y          
        124        6          9          N          
        124        96         10         N          
        124        120        11         N          
        124        198        12         N          
        124        128        13         N          >> common player
        124        202        14         N  
-----------------------------------------------      
        125        256        0          N          
        125        58         1          N          
        125        10         2          N          
        125        47         3          N          
        125        103        4          N          
        125        167        5          N          
        125        221        6          N          
        125        128        7          N          >> common player
        125        105        8          N          
        125        96         9          Y          
        125        180        10         N          
        125        210        11         N          
        125        229        12         N          
        125        30         13         N          
        125        33         14         N       

如您所见,球员 128 是这三支球队中的常见球员。我还需要找到其他常见的玩家。

到目前为止,我尝试过的是以下查询,我猜它是将每个捐赠团队与所有其他团队进行比较,并获取每个比较中单独存在的任何共同玩家。

SELECT
  t1.team_id,
  t1.player_id,
  t2.team_id,
  t2.player_id
FROM team_players_order AS t1
  INNER JOIN team_players_order AS t2
    ON (t1.team_id != t2.team_id
        AND t1.player_id = t2.player_id)
WHERE t1.team_id IN(117,124,125)
    AND t2.team_id IN(117,124,125)
ORDER BY t1.team_id, t2.team_id

返回:

team_id    player_id  team_id    player_id  
117        221        124        221        
117        88         124        88         
117        96         124        96         
117        105        124        105        
117        128        124        128        
117        165        124        165        
117        180        125        180        
117        221        125        221        
117        229        125        229        
117        96         125        96         
117        105        125        105        
117        128        125        128        
124        128        117        128        
124        165        117        165        
124        221        117        221        
124        88         117        88         
124        96         117        96         
124        105        117        105        
124        128        125        128        
124        30         125        30         
124        221        125        221        
124        47         125        47         
124        96         125        96         
124        105        125        105        
125        128        117        128        
125        180        117        180        
125        221        117        221        
125        229        117        229        
125        96         117        96         
125        105        117        105        
125        128        124        128        
125        221        124        221        
125        30         124        30         
125        47         124        47         
125        96         124        96         
125        105        124        105        

但我想要的是:

  1. 存在于所有捐赠团队中的玩家(按他们的 ID)
  2. 存在于所有球队中的球员。

n.b.一旦给出,团队列表可能会达到 100 个。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    拥有是解决方案

    存在于所有球队中的球员

    select team_id, player_id, count(*) nb from team_players_order
    group by player_id 
    having nb > 1
    

    存在于所有捐赠团队中的球员

    select team_id, player_id, count(*) nb from team_players_order
    where team_id in (124, 117)
    group by player_id 
    having nb > 1
    

    【讨论】:

    • 感谢您的回答。 1 in (nb > 1) 是否与团队数量有关?意思是如果我有 5 个团队,那么我应该放 nb>4 而不是 1 对吗?
    • (nb > 1) 中的 1 与玩家数量有关(因为我们使用 player_id 进行分组)。 1 表示您希望拥有的相同球员超过 1 支球队。因此,例如,如果您想获得超过 3 支球队的球员,那么您应该写:拥有 nb > 3
    【解决方案2】:

    您可以使用“HAVING COUNT”来了解哪个玩家在多个团队中。

    SELECT player_id FROM team_players GROUP BY team_id HAVING COUNT(team_id) > 1
    

    列出在其他球队中有球员的球队:

     SELECT team_id FROM team_players GROUP BY team_id HAVING COUNT(player_id) > 1
    

    希望有帮助!

    【讨论】:

    • 感谢您的回答。但似乎它会返回至少存在一次的玩家。所以假设玩家 A 存在于两支球队中,那么 A 将出现在结果中,而他只有在他存在于所有给定球队时才会出现。
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多