집 >데이터 베이스 >MySQL 튜토리얼 >MySQL에서 발신자별로 가장 최근 이메일을 효율적으로 선택하려면 어떻게 해야 합니까?
최근 이메일 검색을 위한 MySQL 쿼리 최적화
MySQL의 GROUP BY
및 ORDER BY
절은 데이터 구성을 위한 강력한 도구이지만 보낸 사람별로 가장 최근 이메일을 효율적으로 선택하려면 신중한 고려가 필요합니다. 순진한 접근 방식은 잘못된 결과를 낳을 수 있습니다.
예를 들어, 이 쿼리는 보낸 사람별로 이메일을 그룹화하고 타임스탬프별로 정렬하려고 시도합니다.
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
문제는 반환된 timestamp
및 subject
에 각 보낸 사람의 최신 이메일이 반영되지 않을 수 있다는 것입니다.
보다 강력한 솔루션에는 먼저 데이터를 타임스탬프별로 정렬한 다음 보낸 사람별로 그룹화하는 하위 쿼리가 포함됩니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!