두 테이블을 연결하고 중복된 줄 값을 새 열에 표시합니다

질문:

나는 이틀 동안 이 위에서 아무런 도움도 찾지 못했다.
나는 책상이 두 개 있다.
1. 선수
신분증
이름:
1
AA
2
BB

코코스 제도
4
DD
2. 일치
신분증
유저 id
일치 id
일자
라이벌 있어요?
1
1
1
2021-06-23
0
2
2
1
2021-06-23
0


2
2021-06-21
0
4
4

2021-06-22
1
예기한 결과
일치 id
일자
첫 번째 상대의 이름.
두 번째 상대의 이름.
1
2021-06-23
AA
BB
2
2021-06-21
코코스 제도

2021-06-22
DD
DD
나는 이 두 표를 새 열명(첫 번째 상대명과 두 번째 상대명)으로 연결하고 싶다.
다음 조건이 충족되면 다음을 수행합니다.
  • 중복된 경기 id가 있지만 다른 선수 id가 존재하면 두 개의 단독 열에 그들의 이름을 표시한다.
  • 일치하는 id가 하나만 있다면 유저 id가 있고 상대방이 0이면 첫 번째 상대방 이름만 표시해야 한다
  • match id가 1개이고 player id가 1개이며has Operator가 1로 나열된 경우 첫 번째 Operator name과 두 번째 Operator name은 같은 값을 표시해야 합니다.
  • 답안

    테스트하지 않았지만 저는 이것이 작용할 것이라고 생각합니다. 기본적으로 이것은 서로 다른 장면에서 표를 자신에게 연결한 다음에 일치하는 장면을 검사합니다.
    SELECT
      m.match_id
     ,m.date
     ,p1.name AS first_opponent_name
     ,CASE WHEN p2.name IS NOT NULL THEN p2.name 
           WHEN nop2.match_id IS NOT NULL THEN '' 
           WHEN samep2.match_id IS NOT NULL THEN p1.name END AS second_opponent_name 
    FROM
      matching AS m
    INNER JOIN players AS p1
      ON m.player_id = p1.player_id 
    LEFT JOIN matching AS hasp2
      ON m.match_id = hasp2.match_id
      AND m.player_id <> hasp2.player_id
    LEFT JOIN players AS p2
      ON hasp2.player_id = p2.player_id
    LEFT JOIN (
      SELECT
        match_id
      FROM
        matching
      WHERE
        has_opponent = 0
      GROUP BY
        match_id
      HAVING COUNT(*) = 1
    ) AS nop2
      ON m.match_id = nop2.match_id
    LEFT JOIN (
      SELECT
        match_id
      FROM
        matching
      WHERE
        has_opponent = 1
    ) AS samep2
      ON m.match_id = samep2.match_id
    
    hasp2나samep2 연결을 사용하지 않을 수 있습니다. 만약 다른 두 가지 상황이 만족하지 않는다면 데이터에 대한 신뢰 정도에 따라 이것이 실행 가능한 선택인지 알 수 있습니다.