집 >데이터 베이스 >MySQL 튜토리얼 >보낸 사람별로 이메일을 안정적으로 그룹화하고 MySQL에서 가장 최근 제목과 타임스탬프를 검색하는 방법은 무엇입니까?
MySQL 이메일 그룹화: 정확한 최근 제목 및 타임스탬프 보장
MySQL에서 보낸 사람별로 이메일 데이터를 검색하고 그룹화하려면 제목과 타임스탬프가 최신 이메일을 반영하도록 신중하게 고려해야 합니다. 표준 GROUP BY
및 ORDER BY
절만으로는 일관성 없는 결과가 나올 수 있습니다.
기본 GROUP BY
쿼리 문제
일반적이지만 결함이 있는 접근 방식은 다음과 같습니다.
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
이 쿼리는 보낸 사람별로 그룹화하려고 시도하지만 선택한 subject
및 timestamp
가 일관되게 최신 항목이 아닙니다.
하위 쿼리 솔루션
더 안정적인 방법은 그룹화하기 전에 순서의 우선순위를 지정하는 하위 쿼리를 포함합니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!