복붙노트

[SQL] MySQL은 "그룹으로"와 "주문"

SQL

MySQL은 "그룹으로"와 "주문"

내가 보낸에서하여 전자 메일과 그룹을의 테이블에서 행의 무리를 선택할 수 있어야합니다. 내 쿼리는 다음과 같습니다 :

SELECT 
    `timestamp`, `fromEmail`, `subject`
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`) 
ORDER BY `timestamp` DESC

내가 원하는 쿼리는 거의 작동합니다 - 그것은 이메일로 그룹화 기록을 선택합니다. 문제는 제목과 특정 전자 메일 주소에 대한 가장 최근의 기록에 대응을하지 타임 스탬프 것입니다.

예를 들어, 반환 할 수 있습니다 :

fromEmail: john@example.com, subject: hello
fromEmail: mark@example.com, subject: welcome

데이터베이스의 레코드가있는 경우 :

fromEmail: john@example.com, subject: hello
fromEmail: john@example.com, subject: programming question
fromEmail: mark@example.com, subject: welcome

은 "질문을 프로그래밍"피사체가 가장 최근의 경우 전자 메일을 그룹화 할 때, 어떻게 GET MySQL은 그 기록을 선택 할 수 있습니까?

해결법

  1. ==============================

    1.간단한 해결책은 먼저 ORDER 문 부속 선택에 쿼리를 포장하고 나중에는 GROUP BY를 적용하는 것입니다 :

    간단한 해결책은 먼저 ORDER 문 부속 선택에 쿼리를 포장하고 나중에는 GROUP BY를 적용하는 것입니다 :

    SELECT * FROM ( 
        SELECT `timestamp`, `fromEmail`, `subject`
        FROM `incomingEmails` 
        ORDER BY `timestamp` DESC
    ) AS tmp_table GROUP BY LOWER(`fromEmail`)
    

    이 조인하지만 훨씬 좋네요 보이는 사용하는 것과 비슷합니다.

    GROUP BY 절과 함께 SELECT 비 집계 열을 사용하여 비 표준입니다. MySQL은 일반적으로 발견 된 첫 번째 행의 값을 반환하고 나머지는 폐기됩니다. BY 절 순서는 반환 된 열 값이 아닌 버려진 것들에 적용됩니다.

    중요 업데이트 선택이 아닌 집계 열은 실제로 사업에 사용하지만,에 의존해서는 안됩니다. MySQL의 문서 당 "이것은 GROUP BY에 이름이없는 각 집계되지 열의 모든 값이 각 그룹에 대해 동일 때 주로 유용합니다. 서버들은 값이 동일하므로하지 않는 한, 각 그룹의 모든 값을 자유롭게 선택할 수있다 선택된은 불확정입니다. "

    5.6.21 현재 나는 정렬하여 순서를 되 돌리는 임시 테이블에 BY 그룹과 함께 주목 문제가 있습니다.

    5.7.5 현재 ONLY_FULL_GROUP_BY는 비 집계 열을 사용하는 것은 불가능 즉, 기본적으로 활성화되어 있습니다.

    보다 http://www.cafewebmaster.com/mysql-order-sort-group https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

  2. ==============================

    2.여기에 한 가지 방법이다 :

    여기에 한 가지 방법이다 :

    SELECT cur.textID, cur.fromEmail, cur.subject, 
         cur.timestamp, cur.read
    FROM incomingEmails cur
    LEFT JOIN incomingEmails next
        on cur.fromEmail = next.fromEmail
        and cur.timestamp < next.timestamp
    WHERE next.timestamp is null
    and cur.toUserID = '$userID' 
    ORDER BY LOWER(cur.fromEmail)
    

    기본적으로, 나중에 행을 검색, 자신의 표를 가입 할 수 있습니다. where 절에서 나중에 행이 될 수없는 상태입니다. 이렇게하면 최신 행을 제공합니다.

    같은 타임 스탬프 여러 이메일이있을 경우,이 쿼리는 정제가 필요합니다. 이메일 테이블의 증분 ID 열이있을 경우,이 같은 가입 변경 :

    LEFT JOIN incomingEmails next
        on cur.fromEmail = next.fromEmail
        and cur.id < next.id
    
  3. ==============================

    3.이 같은 GROUP BY 사용하여 쿼리를 포장하여하여 ORDER BY는 그룹을 수행합니다

    이 같은 GROUP BY 사용하여 쿼리를 포장하여하여 ORDER BY는 그룹을 수행합니다

    SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
    
  4. ==============================

    4.그룹이 임의로 창에서 레코드를 선택하기 때문에 이미 답변에서 지적한 바와 같이, 현재의 대답은 잘못된 것입니다.

    그룹이 임의로 창에서 레코드를 선택하기 때문에 이미 답변에서 지적한 바와 같이, 현재의 대답은 잘못된 것입니다.

    하나의 MySQL 5.6 또는 ONLY_FULL_GROUP_BY와 MySQL을 5.7을 사용하는 경우, 올바른 (결정) 쿼리는 다음과 같습니다

    SELECT incomingEmails.*
      FROM (
        SELECT fromEmail, MAX(timestamp) `timestamp`
        FROM incomingEmails
        GROUP BY fromEmail
      ) filtered_incomingEmails
      JOIN incomingEmails USING (fromEmail, timestamp)
    GROUP BY fromEmail, timestamp
    

    효율적으로 실행할 수있는 쿼리를 위해서는 적절한 색인이 필요합니다.

    단순화를 위해, 나는 대부분의 경우에 사용되지 않습니다 LOWER ()를 제거했습니다합니다.

  5. ==============================

    5.SQL 표준에 따르면 당신은 선택 목록에서 비 집계 열을 사용할 수 없습니다. MySQL은 이러한 사용 (사용 uless ONLY_FULL_GROUP_BY 모드)를 수 있지만 결과는 예측할 수 없습니다.

    SQL 표준에 따르면 당신은 선택 목록에서 비 집계 열을 사용할 수 없습니다. MySQL은 이러한 사용 (사용 uless ONLY_FULL_GROUP_BY 모드)를 수 있지만 결과는 예측할 수 없습니다.

    ONLY_FULL_GROUP_BY

    주제 - 당신은 첫 번째, 두 번째 쿼리 (또는 하위 쿼리)로, 다음 fromEmail, MIN (읽기)를 선택한 것이다.

  6. ==============================

    6.나는에 무엇을 넣어 인덱스 하위 쿼리 접근 방식은 무섭게 상관없이 ineficient 때문에,이 표시된 것보다 더 복잡한 쿼리에 대한 접근을 모두 고생, 나는 외부 얻을 수 있기 때문에 최대 절전 모드를 통해 자신을 조인

    나는에 무엇을 넣어 인덱스 하위 쿼리 접근 방식은 무섭게 상관없이 ineficient 때문에,이 표시된 것보다 더 복잡한 쿼리에 대한 접근을 모두 고생, 나는 외부 얻을 수 있기 때문에 최대 절전 모드를 통해 자신을 조인

    이 작업을 수행하는 가장 좋은 (쉬운) 방법은 당신이 필요로하는 분야의 연결을 포함하도록 구성되어 다음 SELECT 절에 표현식을 사용하여 꺼내 무언가에 의해 그룹이다. 당신은 MAX ()를해야 할 경우 반드시 필드는이를 통해 연결된 기업의 가장 중요한 마지막에 항상) MAX (원하는 확인하십시오.

    이 문제를 이해하는 열쇠는 이러한 다른 필드는 어떤 만족 맥스 (실체에 대한 불변 경우 쿼리가 무시 될 수 있도록 연결의 종류의 다른 조각의 측면에서) 이해 할 수 있다는 것입니다. 그것은이 링크의 맨 아래에서이 작업을 수행하는 방법에 대해 설명합니다. http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

    당신이 (트리거와 같은) 오전 삽입 / 업데이트 이벤트를 얻을 수있는 경우 그룹에 의해이 이상 그냥 필드 있다면 당신은 실제로 MAX에 원하는대로 (빨리 색인이 쿼리가 될 것입니다 수있는 필드의 연결을 미리 계산하기 ). 당신은 여러 필드의 최대 값을 얻을하는 데 사용할 수 있습니다. 나는 중첩 된 집합으로 expresssed 다차원 나무에 대해 쿼리를 수행하는 데 사용합니다.

  7. from https://stackoverflow.com/questions/1066453/mysql-group-by-and-order-by by cc-by-sa and MIT license