source

네 개의 테이블에서 선택하고 일부 결과를 하나의 열로 그룹화

manysource 2023. 7. 9. 11:17

네 개의 테이블에서 선택하고 일부 결과를 하나의 열로 그룹화

스포츠_게임 테이블

==========================================================================
| game_id | team_id | game_type | time_started | time_ended | planned_by |
|========================================================================|
|   1     |    1    |     1     | 1640799417   | 1641146196 |     1      |
|   2     |    2    |     1     | 1640971535   | 1641579516 |     1      |
|   3     |    1    |     2     | 1640971553   | 1641582723 |     8      |
|   4     |    2    |     2     | 1640971585   | 1641404242 |     9      |
|   5     |    3    |     4     | 1641061431   | 1641754479 |     12     |
==========================================================================

위의 표와 아래의 표를 결합할 수 있었습니다.

game_types 테이블

==============================
| game_type | game_type_name |
|============================|
|     1     |   football     |
|     2     |   baseball     |
|     3     |     golf       |
|     4     |    tennis      |
==============================

다음 SQL과 함께

SELECT *
    FROM sport_games
    INNER JOIN game_types
    ON sport_games.game_type = game_types.game_type

하지만, 저는 지금 제 자신이 이리저리 돌아다니며, 잠재적인 해결책을 차례로 시도하고 있다는 것을 발견하고 있습니다.두 표의 데이터를 더 포함해야 합니다.participents그리고.user_basic.

participents테이블은 단순히 그것을 가지고 있습니다.game_id그리고.user_id열, 참가자당 하나의 행, 둘 다 결합되어 기본 키가 되는 열 및 내부user_basic테이블, 찾을 수 있습니다.user_id그들과 함께user_name.

를 위해planned_by첫 번째 표의 열, 이것 또한user_id나는 그들의 사용자 이름도 얻고 싶습니다.

모든 참가자들과 함께, 저는 그들이 게임별로 그룹화된 한 칸 안에 있기를 바랍니다.

내가 시도한 것들

  • group_concat( .. )아마도 제가 이것을 완전히 잘못 사용하고 있었을 것입니다. 저는 다른 테이블의 전체 결과 집합을 그룹화하는 것만 달성할 수 있었고 결합에서 이것을 올바르게 사용하는 방법을 파악할 수 없었던 것 같습니다.
  • STRING_AGG( ... )처음에는 5.5 MariaDB에서 실행할 때 이 기능을 사용할 수 없었기 때문에 업데이트하기가 쉽지 않았습니다.지금은 MariaDB 10.3을 사용하고 있지만, 스택 오버플로 등을 여러 번 겪었음에도 불구하고 이 작업에 사용할 수 있는 가장 간단한 기능을 아직도 얻을 수 없는 것 같습니다.

저는 약간 막막한 느낌이 듭니다, 제가 앞으로 나아가는 것처럼 보이는 어떤 진전도, 저는 두 걸음 뒤로 물러납니다!그리고 다음은 그것을 사용하는 것입니다.JOIN이 중에서, 저는 제가 저를 올바른 경로에 배치하기 위해 제 검색을 표현하고 있는지 잘 모르겠습니다. 그래서 제 질문 제목이 지금 약간 모호할 수도 있습니다. 만약 그렇다면 죄송합니다! - 다른 제안을 해주세요, 감사합니다.

원하는 결과의 예

"2": { // <- game_id
        "game_type": 2,
        "game_type_name": "baseball",
        "participants": {
            "1": "username_1",
            "2": "username_21",
            "3": "username_3",
            "4": "username_4",
        },
        "time_started": 1641061431,
        "time_completed": 1641754479,
        "planned_by": {
            "851730": "username_1",
        }
}

테이블과 테이블을 올바르게 결합해야 합니다.user_basic두 번: 참가자와 게임을 계획한 사용자를 가져옵니다.

MariaDB 10.5+의 경우 다음을 사용할 수 있습니다.JSON_ARRAYAGG():

SELECT sg.game_id, 
       sg.game_type,
       gt.game_type_name,
       JSON_ARRAYAGG(JSON_OBJECT(ub.user_id, ub.user_name)) participants,
       sg.time_started,
       sg.time_ended,
       JSON_OBJECT(sg.planned_by, pb.user_name) planned_by
FROM sports_games sg
INNER JOIN user_basic pb ON pb.user_id = sg.planned_by
INNER JOIN game_types gt ON gt.game_type = sg.game_type
INNER JOIN participents p ON p.game_id = sg.game_id
INNER JOIN user_basic ub ON ub.user_id = p.user_id
GROUP BY sg.game_id;

이전 버전의 경우 사용GROUP_CONCAT():

SELECT sg.game_id, 
       sg.game_type,
       gt.game_type_name,
       CONCAT('{', GROUP_CONCAT(ub.user_id, ' : ', ub.user_name SEPARATOR ', '), '}') participants,
       sg.time_started,
       sg.time_ended,
       CONCAT('{', GROUP_CONCAT(DISTINCT sg.planned_by, ' : ', pb.user_name), '}') planned_by
FROM sports_games sg
INNER JOIN user_basic pb ON pb.user_id = sg.planned_by
INNER JOIN game_types gt ON gt.game_type = sg.game_type
INNER JOIN participents p ON p.game_id = sg.game_id
INNER JOIN user_basic ub ON ub.user_id = p.user_id
GROUP BY sg.game_id;

데모를 참조하십시오.

아이즈time_ready기존 열 또는 다른 열에서 계산된 열?안 보여…time_ready제공된 표 중 하나에 표시됩니다.

SELECT 
   game_types.game_type
   , game_types.game_type_name
   , participents.user_id
   , user_basic.user_name
   , sports_games.time_started
   , sports_games.time_ended AS time_completed
   , sports_games.planned_by
FROM sports_games
INNER JOIN game_types
   ON sports_games.game_type = game_types.game_type
INNER JOIN participents
   ON sports_games.game_id = participents.game_id
INNER JOIN user_basic
   ON participants.user_id = user_basic.user_id
ORDER BY
   game_types.game_type

언급URL : https://stackoverflow.com/questions/71099379/selecting-from-four-tables-and-grouping-some-results-into-one-column