2014-12-12 2 views
0

변화하는 요구 사항으로 인해 몇 달 전에 만든 인터페이스를 다시 방문했습니다. 더 많은 기능, 더 많은 데이터. 데이터 over here의 까다로운 주문 요구 사항에 대한 도움을 받았습니다. 그러나 요구 사항이 변경되었거나보다 정확하고 확장되었습니다. 나는 지금 몇 시간 동안 땜질하고 있었고 성공을 거두지 못했습니다. SO이 나를 다시 뭉개지게 할 수도 있습니다.MySQL 복잡한 ORDER BY 문제

다음은 데이터베이스에 표시되는 단순화 된 샘플 데이터 및 주문 방법입니다.

SELECT * 
FROM reports as r 
ORDER BY 
    FIND_IN_SET(r.job_id, (SELECT GROUP_CONCAT(job_id ORDER BY id DESC) 
          FROM reports 
          WHERE action_id = 1)), 
    r.action_id 

을하지만 계정에 반복을 doesen't :

 
       **RAW**         **DESIRED** 

╔════╦════════╦═══════════╦═══════════╗ ╔════╦════════╦═══════════╦═══════════╗ 
║ id ║ job_id ║ action_id ║ iteration ║ ║ id ║ job_id ║ action_id ║ iteration ║ 
╠════╬════════╬═══════════╬═══════════╣ ╠════╬════════╬═══════════╬═══════════╣ 
║ 1 ║  1 ║   1 ║   0 ║ ║ 14 ║  6 ║   1 ║   0 ║ 
║ 2 ║  1 ║   2 ║   0 ║ ║ 16 ║  6 ║   2 ║   0 ║ 
║ 3 ║  2 ║   1 ║   0 ║ ║ 12 ║  1 ║   1 ║   1 ║ 
║ 4 ║  3 ║   1 ║   0 ║ ║ 13 ║  1 ║   2 ║   1 ║ 
║ 5 ║  4 ║   1 ║   0 ║ ║ 15 ║  1 ║   3 ║   1 ║ 
║ 6 ║  3 ║   2 ║   0 ║ ║ 8 ║  5 ║   1 ║   0 ║ 
║ 7 ║  3 ║   3 ║   0 ║ ║ 10 ║  5 ║   2 ║   0 ║ 
║ 8 ║  5 ║   1 ║   0 ║ ║ 11 ║  5 ║   3 ║   0 ║ 
║ 9 ║  4 ║   2 ║   0 ║ ║ 5 ║  4 ║   1 ║   0 ║ 
║ 10 ║  5 ║   2 ║   0 ║ ║ 9 ║  4 ║   2 ║   0 ║ 
║ 11 ║  5 ║   3 ║   0 ║ ║ 4 ║  3 ║   1 ║   0 ║ 
║ 12 ║  1 ║   1 ║   1 ║ ║ 6 ║  3 ║   2 ║   0 ║ 
║ 13 ║  1 ║   2 ║   1 ║ ║ 7 ║  3 ║   3 ║   0 ║ 
║ 14 ║  6 ║   1 ║   0 ║ ║ 3 ║  2 ║   1 ║   0 ║ 
║ 15 ║  1 ║   3 ║   1 ║ ║ 1 ║  1 ║   1 ║   0 ║ 
║ 16 ║  6 ║   2 ║   0 ║ ║ 2 ║  1 ║   2 ║   0 ║ 
╚════╩════════╩═══════════╩═══════════╝ ╚════╩════════╩═══════════╩═══════════╝ 
 
       **EXPLAINED** 

╔════╦════════╦═══════════╦═══════════╗ 
║ id ║ job_id ║ action_id ║ iteration ║ 
╠════╬════════╬═══════════╬═══════════╣  ORDERED BY: 
║ 14 ║  6 ║   1 ║   0 ║ 
║ 16 ║  6 ║   2 ║   0 ║  The largest id with action_id of 1 
╠════╬════════╬═══════════╬═══════════╣  followed by all of the rows with the 
║ 12 ║  1 ║   1 ║   1 ║  same job_id and iteration number as 
║ 13 ║  1 ║   2 ║   1 ║  the first, ordered by ascending 
║ 15 ║  1 ║   3 ║   1 ║  action_id. 
╠════╬════════╬═══════════╬═══════════╣ 
║ 8 ║  5 ║   1 ║   0 ║  Then the next largest id with 
║ 10 ║  5 ║   2 ║   0 ║  action_id = 1, etc. 
║ 11 ║  5 ║   3 ║   0 ║ 
╠════╬════════╬═══════════╬═══════════╣ 
║ 5 ║  4 ║   1 ║   0 ║ 
║ 9 ║  4 ║   2 ║   0 ║ 
╠════╬════════╬═══════════╬═══════════╣ 
║ 4 ║  3 ║   1 ║   0 ║ 
║ 6 ║  3 ║   2 ║   0 ║ 
║ 7 ║  3 ║   3 ║   0 ║ 
╠════╬════════╬═══════════╬═══════════╣ 
║ 3 ║  2 ║   1 ║   0 ║ 
╠════╬════════╬═══════════╬═══════════╣ 
║ 1 ║  1 ║   1 ║   0 ║ 
║ 2 ║  1 ║   2 ║   0 ║ 
╚════╩════════╩═══════════╩═══════════╝ 

나는 현재이 같은 ORDER BY을 사용하고 있습니다. 나는 그 논리에 맞는 부분을 볼 수 없다. 아무도 도움을 줄 수 있는가?

감사합니다.

답변

1

흥미롭지 만 복잡하지는 않습니다. 자체 조인과 하위 선택을 사용해야합니다. 게다가 주문 순서는 지금 읽기가 더 쉽다고 생각합니다.

http://sqlfiddle.com/#!2/7f9d2/1/0

SELECT r.id, r.job_Id, r.action_id, r.iteration, r2.mid, r2.job_Id 
FROM raw r 
INNER JOIN (SELECT max(ID) mID, Job_ID, iteration 
      FROM raw 
      WHERE action_ID=1 
      GROUP BY Job_Id, iteration) r2 
on R.Job_Id = R2.Job_ID 
and R.Iteration = R2.iteration 
ORDER BY r2.mid desc, iteration, r.action_Id 

는 여기서 핵심은 먼저 함께 설명 된 그룹을 받고있다. sub select를 수행하여 각 그룹 내의 최대 ID를 얻은 다음 해당 그룹을 기본 세트로 다시 결합한 다음 자체 조인/하위 쿼리의 최대 ID를 기반으로 정렬을 적용하고 다른 논리를 ... 네가 뭘했는지 알아봐.

SQL을 집합으로 생각하면이 정렬이 쉽습니다.

각 그룹 (내 인라인보기)에 대한 그룹 및 최대 값을 정의하는 데이터 세트가 필요합니다. 하위 집합, 반복, 그 다음 마스터 집합의 해당 최대 값을 기준으로 정렬해야합니다.

내가 바이올린으로 포팅 할 때 일부 데이터가 엉망인 경우를 대비하여 왼쪽 결합을 사용했지만 내부는 도 올바르게 작동해야합니다.