>데이터 베이스 >MySQL 튜토리얼 >보낸 사람별로 이메일을 안정적으로 그룹화하고 MySQL에서 가장 최근 제목과 타임스탬프를 검색하는 방법은 무엇입니까?

보낸 사람별로 이메일을 안정적으로 그룹화하고 MySQL에서 가장 최근 제목과 타임스탬프를 검색하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-12 14:01:43648검색

How to reliably group emails by sender and retrieve the most recent subject and timestamp in MySQL?

MySQL 이메일 그룹화: 정확한 최근 제목 및 타임스탬프 보장

MySQL에서 보낸 사람별로 이메일 데이터를 검색하고 그룹화하려면 제목과 타임스탬프가 최신 이메일을 반영하도록 신중하게 고려해야 합니다. 표준 GROUP BYORDER BY 절만으로는 일관성 없는 결과가 나올 수 있습니다.

기본 GROUP BY 쿼리 문제

일반적이지만 결함이 있는 접근 방식은 다음과 같습니다.

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

이 쿼리는 보낸 사람별로 그룹화하려고 시도하지만 선택한 subjecttimestamp가 일관되게 최신 항목이 아닙니다.

하위 쿼리 솔루션

더 안정적인 방법은 그룹화하기 전에 순서의 우선순위를 지정하는 하위 쿼리를 포함합니다.

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

이렇게 하면 작업 순서가 반대가 됩니다. 내부 쿼리는 타임스탬프를 기준으로 정렬하고 외부 쿼리는 보낸 사람을 기준으로 그룹화하여 가장 최근 이메일 데이터가 선택되도록 합니다.

중요 고려 사항 및 MySQL 5.7 호환성

SELECT 목록에서 집계되지 않은 열을 GROUP BY과 함께 사용하는 것은 비표준 SQL 동작입니다. MySQL의 처리는 예측할 수 없으며 종종 각 그룹 내의 임의 행에서 값을 반환합니다.

MySQL 5.7.5부터는 ONLY_FULL_GROUP_BY이 기본값이므로 적절한 집계 기능 없이 집계되지 않은 열을 포함하면 오류가 발생합니다.

MySQL 5.7 이상 모범 사례

특히 MySQL 5.7 이상 버전에서 최적의 호환성과 명확성을 위해 ANY_VALUE():

을 사용하세요.
<code class="language-sql">SELECT `timestamp`, `fromEmail`, ANY_VALUE(`subject`) AS `subject`
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`) 
ORDER BY `timestamp` DESC</code>

이는 subject 열의 모든 값이 각 그룹에 허용된다는 점을 명시적으로 명시하므로 쿼리가 올바르게 작동하고 모호함이 방지됩니다. ORDER BY 절로 인해 가장 최근 타임스탬프가 유지됩니다.

위 내용은 보낸 사람별로 이메일을 안정적으로 그룹화하고 MySQL에서 가장 최근 제목과 타임스탬프를 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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