如何在以下SQL查询的输出中获得正确的名称?

如何在以下SQL查询的输出中获得正确的名称?,sql,Sql,我试图执行一个查询,其中输出是使用下面提到的表与男性一起玩橄榄球的每个女性的名字。 这是我尝试的查询: select distinct P1.name from Persons P1, Persons P2, SportTogether S where P1.id = S.personA_id and P2.id = S.personB_id and P1.gender = 'female' and P1.gender <>

我试图执行一个查询,其中输出是使用下面提到的表与男性一起玩橄榄球的每个女性的名字。 这是我尝试的查询:

select distinct P1.name
from Persons P1, 
     Persons  P2, 
     SportTogether S
where P1.id = S.personA_id 
     and P2.id = S.personB_id 
     and P1.gender = 'female' 
     and P1.gender <> P2.gender and S.sport = 'rugby'
     or P1.id = S.personA_id 
     and P2.id = S.personB_id 
     and P1.gender = 'male' 
     and P1.gender <> P2.gender 
     and S.sport = 'rugby'
我知道我使用这个查询得到了正确的行,但是在输出中,我需要女性的名字而不是“Woody Allen”。有人能帮我吗

SportTogether

+----+------------+------------+-----------+
| id | personA_id | personB_id |   sport   |
+----+------------+------------+-----------+
| 21 |         11 |         12 | rugby     |
| 20 |         11 |         14 | badminton |
| 22 |         11 |         14 | rugby     |
| 25 |         11 |         14 | tennis    |
| 23 |         13 |         12 | rugby     |
| 19 |         14 |         11 | tennis    |
| 24 |         14 |         13 | badminton |
+----+------------+------------+-----------+

+----+-------------------+-----------+-----+----------+--------+
| id |       name        |  address  | age | eyeColor | gender |
+----+-------------------+-----------+-----+----------+--------+
| 11 | Woody Allen       | Amsterdam |  35 | green    | male   |
| 12 | Charlton Heston   | Rome      |  68 | green    | male   |
| 13 | Katharine Hepburn | Rome      |  87 | brown    | female |
| 14 | Rachel McAdams    | Leipzig   |  70 | blue     | female |
+----+-------------------+-----------+-----+----------+--------+
你可以用这个-

select case when P1.gender = 'male' then P2.name else P1.name end as name
from Persons P1, 
     Persons  P2, 
     SportTogether S
where P1.id = S.personA_id 
  and P2.id = S.personB_id
  and P1.gender <> P2.gender 
  and S.sport = 'rugby'
group by case when P1.gender = 'male' then P2.name else P1.name end;
当P1.gender='male'时选择case,然后选择P2.name else P1.name作为name结束
从个人P1,
人员P2,
一起运动
其中P1.id=S.personA\u id
P2.id=S.personB_id
和P1.性别P2.性别
和S.sport=‘橄榄球’
当P1.gender='male'然后P2.name else P1.name end时按大小写分组;
还请注意,查询中不需要或部分。

切勿在
FROM
子句中使用逗号。始终使用正确、明确、标准的连接语法

select distinct pf.name
from SportTogether s join
     Persons pf
     on pf.id in (s.personA_id, s.personB_id) and
        pf.gender = 'female' join
     Persons  pm
     on pm.id in (s.personA_id, s.personB_id) and
        pm.gender = 'male'
where s.sport = 'rugby';

每个连接都是“一起玩”表中两个人中的一个。一个匹配一只雌性,另一个匹配一只雄性。如果有两个男性或两个女性,那么其中一个连接将失败,并且“一起玩”记录不在结果集中。

选择大小写,当P1.gender='male'时,然后选择p2.name ELSE P1.name END from…
只需在请求的第二部分交换PersonA和PersonB,以便p2具有'male'性别而不是P1
select distinct pf.name
from SportTogether s join
     Persons pf
     on pf.id in (s.personA_id, s.personB_id) and
        pf.gender = 'female' join
     Persons  pm
     on pm.id in (s.personA_id, s.personB_id) and
        pm.gender = 'male'
where s.sport = 'rugby';