2014-12-12 2 views
0

Из-за меняющихся требований я пересмотрел интерфейс, который я создал пару месяцев назад. Дополнительные функции, больше данных. Я получил помощь в сложных требованиях к порядку данных over here. Но требования изменились или были более точными, расширены. Я уже несколько часов занимаюсь ремеслом и не добился успеха. Я надеюсь, что SO может помочь мне разблокировать меня еще раз.MySQL сложный вопрос ORDER BY

Вот несколько упрощенных данных образца, которые отображаются в базе данных, и как мне нужно заказать его.

 
       **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 вроде этого:

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 учитывать итерацию. Я не вижу, где я могу вместить эту логику. Может ли кто-нибудь помочь?

Большое спасибо!

ответ

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 для получения максимальных идентификаторов в каждой группе, а затем присоедините эти группы к базовому набору, затем примените сортировку на основе этого максимального идентификатора из собственного объединения/подзапроса ... и вашей другой логики ... вы получить то, что вам нужно.

Подумайте о SQL с точки зрения наборов, эта сортировка упростится.

вам нужен набор данных, который определяет группы и максимальное значение для каждой группы (мой встроенный просмотр). то вам нужно сортировать на основе этого максимального значения из подмножества, итерации, а затем действия из основного набора.

Я использовал левое соединение в случае, если некоторые данные были испорчены, когда я портировал его на скрипку, но внутренний должен работать так же хорошо.