programing

MySQL은 그룹 다음에 null이 아닌 첫 번째 값을 가져옵니다.

batch 2023. 9. 8. 21:18
반응형

MySQL은 그룹 다음에 null이 아닌 첫 번째 값을 가져옵니다.

고유하지는 않지만 필요한 데이터가 있는 큰 테이블이 있습니다.이 표는 여러 개의 조합을 선택한 결과이므로 실제 표가 아닙니다.다른 이유로 실제 테이블로 만들 수 없습니다.

UNION의 모든 테이블에는 결국 고유한 이메일 열이 있습니다.결과 레코드는 다음과 같습니다.

1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   
13  tony@gmail.com  Tony
14  test@test.com   Ozzy
15  test@yahoo.com  Dave
16  tiny@test.com   Tim

보다시피 일부 전자 메일은 이름이 다르거나 존재하지 않는 이름으로 한 번 이상 나타납니다.추가할 때는GROUP BY email마지막 절에서 결과는 다음과 같습니다.

1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   
13  tony@gmail.com  Tony

보다시피 이메일 4는 첫번째 항목을 선택했기 때문에 이름이 없습니다.NULL이름에 걸맞게그런 다음에 사용하려고 했습니다.GROUP_CONCAT결과는 다음과 같습니다.

1   ozzy@test.com   Ozzy
14  test@test.com   Ozzy,Tony
15  test@yahoo.com  Dave,Steve
16  tiny@test.com   Tim
13  tony@gmail.com  Tony

보시다시피, 이제 모든 사용자가 이름을 가지고 있지만 일부 행에는 둘 이상의 이름이 연결되어 있습니다.제가 하고 싶은 일은GROUP BY email그리고 첫번째를 선택합니다.NOT NULL각 행에 대한 각 열의 항목은 이론적으로 다음과 같습니다.

1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com  Steve
4   tiny@test.com   Tim
13  tony@gmail.com  Tony

사용해 보았습니다.COALESCE하지만 뜻대로 되지 않습니다.현재 쿼리는 다음과 같습니다.

SELECT
    id,
    email,
    `name`
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email

많은 테이블을 포함하고 있기 때문에 임시 테이블에서 코드를 제거했지만 모두 선택합니다.email그리고.name기둥.본질적으로 나는 다음과 같은 기능이 필요합니다.GROUP_COALESCE불행하게도 그것은 존재하지 않습니다.내 선택지는?

사용해보기MAX, 다음과 같이:

SELECT
    email,
    MAX(`name`)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email

첫번째를 선택하려면non null가치,GROUP_CONCAT여기서 편리할 겁니다다음은 예시입니다.

SELECT
    email,
    SUBSTRING_INDEX(GROUP_CONCAT(`name`), ',',1)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email;

언급URL : https://stackoverflow.com/questions/22782932/mysql-get-first-non-null-value-after-group-by

반응형