2012-02-08 4 views
0

하위 쿼리를 사용하여 MySQL 쿼리에서 선택한 GROUP BY 결과를 순서대로 정렬 할 수 있습니까? 내 대형 데이터 세트에서 하위 쿼리가 내 쿼리에 상당한로드 시간을 추가한다는 것을 알았습니다. 여기 MySQL이 조인, 그룹화, 선택 항목 선택

비슷한 상황이 작동 내 코드입니다 how to sort order of LEFT JOIN in SQL query?

하지만 부하에 너무 오래 걸립니다 :

SELECT tags.contact_id, n.last 
FROM tags 
LEFT JOIN (SELECT * FROM names ORDER BY timestamp DESC) n 
ON (n.contact_id=tags.contact_id) 
WHERE tags.tag='$tag' 
GROUP BY tags.contact_id 
ORDER BY n.last ASC; 

나는 간단한 승에 참여하고 빠른 결과를 얻을 수 있습니다/테이블 이름이지만 "group by"명령은 나에게 마지막 행이 아니라 조인 된 테이블의 첫 번째 행을 제공합니다.

+0

1 .) 주문에 사용 된 필드에 색인이 있습니까? 2.) 색인의 반대 방향으로 주문하면 색인이 더 느려지므로 색인이 각 사례에 대해 오름차순 또는 내림차순으로 표시되면 신중하게 선택하십시오. – Alfabravo

답변

1

나는 당신이 무엇을하려고하는지 잘 모르겠습니다. 이없는 어느 쪽도 group by 절에,도 집계 값 있지만,

  • n.last를 선택 : 여기에 귀하의 질의에 대한 문제의 일부입니다. MySQL은 이것을 허용하지만 실제로 이점을 취하는 것은 좋지 않습니다.
  • 이 불필요 단지 하위 쿼리가 정말 신중 즉, 원하는 쿼리 결과를 적어 제안 아무것도

을하고 있지 않습니다

  • 에 합류하는 대신, 가입하기 전에 테이블을 정렬 "나는 접촉 ID를 원하고 각 태그의 최신 날짜 "또는 이와 유사한 태그. OP에서 보여준 것보다 더 효율적이고 자연스럽고 쓰기 쉽고 의미 상으로 올바른 쿼리로 이어질 수 있습니다.

    이 질문에 대답하기 위해 "이 GROUP BY 쿼리를 주문 할 수 있습니다"예, 여기 아주 쉽게, 그리고있어 예 : 당신은 LEFT을하고

    select a, b, sum(c) as `c sum` 
    from <table_name> 
    group by a,b 
    order by `c sum` 
    
  • +0

    "그룹화 기준"을 수행하면 많은 행이 하나로 축소됩니다 . 행을 축소하면 해당 행 중 하나에서 정보가 유지됩니다. 제 경우에는 유지할 기본 행이 원하는 행이 아닙니다. – swt83

    +2

    @ swt83'group by '이 어떻게 작동하는지 오해했습니다. ** 올바르게 사용하지 않으면 예측할 수없고 실망스러운 결과를 낳을 것입니다! **이 글을 읽고'max'와' 'min'. –

    +0

    이것은 조인 등으로 인한 나의 첫 경험입니다. 그래서 배우려고합니다. 더 읽기에 당신이 옳다, 나는 이것을 오용하고있다. 감사. – swt83

    0

    는 연락처 ID에 가입하세요 이는 네임 테이블에 일치하는 것을 찾지 않고 모든 태그 접촉을 원한다는 것을 의미합니다. 정말 그럴까요, 아니면 태그 테이블에 항상 "이름"연락처 ID 레코드가 있습니다. 또한, 귀하의 열 "n.Last". 이 사람의 성, 또는 마지막으로 뭔가 말했다되고 있음을, 그래서 ... (타임 스탬프가 실제로 나는 가정 것이다)

    일을, 내가 직접 간단한 가입 만 할 것

    SELECT DISTINCT 
         t.contact_id, 
         n.last 
        FROM 
         tags t 
         JOIN names n 
          ON t.contact_id = n.contact_id 
        WHERE 
         t.tag = '$tag' 
        ORDER BY 
         n.last ASC