【问题标题】:sql query: display names of player those who play Soccer as well as Tennissql查询:显示踢足球和网球的球员姓名
【发布时间】:2011-08-22 15:56:44
【问题描述】:

我在 mysql 数据库中有 3 个表:PLAYERS,SPORTSINTERESTS

PLAYERS 表包含 id 和玩家名称 (id,player_name)

数据示例:

(1,David) 
(2,Jack)
(3,Ron)
(4,Smith)

SPORTS 表包含 id 和运动名称(id,sports_name)

数据示例:

(1,Soccer)
(2,Tennis)
(3,Swimming) 

每个玩家都可能对多项运动感兴趣,因此INTERESTS 表有玩家 ID 和运动 ID。 (player_id,sports_id)

数据示例:

(1,2)
(1,3)
(2,3)

我想显示既玩足球又玩网球的球员的姓名。
不是足球或网球,而是足球和网球。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    未经测试,但我认为这样的方法可能有效:

    SELECT
      player_name
    FROM
      players
    WHERE
      EXISTS (SELECT id FROM interests i WHERE i.player_id = players.id AND i.sports_id = 1)
      AND EXISTS (SELECT id FROM interests i WHERE i.player_id = players.id AND i.sports_id = 2)
    

    【讨论】:

      【解决方案2】:
      Select P.id, P.player_name
      From Players As P
          Join Interests As I
              On I.player_id = P.id
          Join Sports As S
              On S.id = I.sports_id
      Where S.sports_name In('Tennis','Soccer')
      Group By P.id, P.player_name
      Having Count( Distinct S.sports_name ) = 2
      

      【讨论】:

      • 我认为您可能希望按玩家姓名以外的其他名称进行分组,对吧? player.id 列是唯一的,但我不认为 player_name 是唯一的。我认为如果玩家 (1, 'Bob Smith') 喜欢足球而玩家 (2, 'Bob Smith') 喜欢网球,这会给我们带来错误。
      • 您还应该确保兴趣表中的 (player_id,sports_id) 存在唯一约束(或者确保所有行都保持唯一)。因为否则单个球员可能会两次列出他对足球的兴趣,并且会被查询选中。
      • @drewbob - 用户如何知道他们是否在查看副本?即,用户如何知道 (1,Bob Smith) 是否真的与 (2,Bob Smith) 相同。不过,很容易解决。
      • @Roy - 实际上,Count( Distinct S.sports_name ) 两次照顾有相同兴趣的同一个玩家。
      • @Roy - 我不是在谈论重复。我说的是同名的不同玩家。如果 Bob Smithonly 喜欢网球,而他的同名朋友only 喜欢足球,我们不会不小心将他包括在内。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多