>데이터 베이스 >MySQL 튜토리얼 >MySQL에서 발신자별로 가장 최근 이메일을 효율적으로 선택하려면 어떻게 해야 합니까?

MySQL에서 발신자별로 가장 최근 이메일을 효율적으로 선택하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-12 14:10:43149검색

How Can I Efficiently Select the Most Recent Email per Sender in MySQL?

최근 이메일 검색을 위한 MySQL 쿼리 최적화

MySQL의 GROUP BYORDER BY 절은 데이터 구성을 위한 강력한 도구이지만 보낸 사람별로 가장 최근 이메일을 효율적으로 선택하려면 신중한 고려가 필요합니다. 순진한 접근 방식은 잘못된 결과를 낳을 수 있습니다.

예를 들어, 이 쿼리는 보낸 사람별로 이메일을 그룹화하고 타임스탬프별로 정렬하려고 시도합니다.

<code class="language-sql">SELECT 
    `timestamp`, `fromEmail`, `subject`
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`) 
ORDER BY `timestamp` DESC</code>

문제는 반환된 timestampsubject에 각 보낸 사람의 최신 이메일이 반영되지 않을 수 있다는 것입니다.

보다 강력한 솔루션에는 먼저 데이터를 타임스탬프별로 정렬한 다음 보낸 사람별로 그룹화하는 하위 쿼리가 포함됩니다.

<code class="language-sql">SELECT * FROM ( 
    SELECT `timestamp`, `fromEmail`, `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)</code>

이렇게 하면 타임스탬프별로 정렬된 임시 테이블(tmp_table)이 생성되어 그룹화 작업에서 보낸 사람당 가장 최근 이메일이 선택됩니다.

그러나 이 방법은 GROUP BY 절에서 집계되지 않은 열에 대해 임의의 값을 선택하는 MySQL의 동작에 의존합니다. 이는 비표준 SQL이므로 예측할 수 없는 결과가 발생할 수 있습니다. MySQL 5.7.5에는 ONLY_FULL_GROUP_BY이 기본적으로 도입되어 이 접근 방식이 문제가 되었습니다.

이 문제를 해결하기 위해 ANY_VALUE()(MySQL 5.7에 도입됨)을 사용할 수 있습니다. 이 방법은 집계되지 않은 열에 대해 그룹에서 값을 선택할 수 있도록 명시적으로 허용합니다.

<code class="language-sql">SELECT ANY_VALUE(`timestamp`) AS recent_timestamp, 
       ANY_VALUE(`fromEmail`) AS sender_email, 
       ANY_VALUE(`subject`) AS subject
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`)
ORDER BY recent_timestamp DESC</code>

이 쿼리는 MySQL 데이터베이스에서 각 발신자의 가장 최근 이메일을 검색하는 보다 안정적이고 표준을 준수하는 방법을 제공합니다.

위 내용은 MySQL에서 발신자별로 가장 최근 이메일을 효율적으로 선택하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.