2015-10-01 3 views
3

У меня есть следующий запросMySQL - Заказывайте Родительской позиции и ребенка Позиция

SELECT process.* 
FROM (`process`) 
WHERE `company_id` = '1' AND `status` = '1'               
ORDER BY COALESCE(`process`.`parent_id`, `process`.`id`), `process`.`parent_id` IS NOT NULL asc, `process`.`position` asc 

См SQLFiddie для таблиц, данных и запросов

http://sqlfiddle.com/#!9/d50ba/2

Запрос сортирует подпроцесс правильно на его номер позиции. Однако мне также нужен Основной процесс, отсортированный по его номеру позиции (оба ASC).

Редактировать Порядок оп ИДС должно быть 7, 1, 16, 41, 42, 6, 40 Это следует сначала заказать все основные процессы на положении ASC и в пределах каждого основного технологического заказа все относящиеся к югу процессы на положение ASC

это:

╔═════╦════════════╦═════════════╦════════════════╦═══════════════════╦═════════════╦═══════════════╦═══════════╦═════════════╦═══════════╦═════════╦════════════════════════════╗ 
║ id ║ parent_id ║ company_id ║ department_id ║  name  ║ user_score ║ user_comment ║ ic_score ║ ic_comment ║ position ║ status ║  date_created  ║ 
╠═════╬════════════╬═════════════╬════════════════╬═══════════════════╬═════════════╬═══════════════╬═══════════╬═════════════╬═══════════╬═════════╬════════════════════════════╣ 
║ 1 ║ (null)  ║   1 ║    3 ║ Main Process 1 ║   0 ║ (null)  ║  0 ║ (null)  ║  2 ║  1 ║ February, 02 2015 21:04:03 ║ 
║ 16 ║ 1   ║   1 ║    3 ║ Sub Process 1, 1 ║   0 ║ (null)  ║  0 ║ (null)  ║  1 ║  1 ║ February, 02 2015 21:14:34 ║ 
║ 41 ║ 1   ║   1 ║    3 ║ Sub Process 4, 1 ║   0 ║ (null)  ║  0 ║ (null)  ║  9 ║  1 ║ February, 09 2015 10:06:40 ║ 
║ 6 ║ (null)  ║   1 ║    3 ║ Main Process 2 ║   0 ║ (null)  ║  0 ║ (null)  ║  8 ║  1 ║ February, 02 2015 21:08:53 ║ 
║ 7 ║ (null)  ║   1 ║    3 ║ Main Process 3 ║   0 ║ (null)  ║  0 ║ (null)  ║  1 ║  1 ║ February, 02 2015 21:09:08 ║ 
║ 40 ║ (null)  ║   1 ║    3 ║ Main Process 2 ║   0 ║ (null)  ║  0 ║ (null)  ║  16 ║  1 ║ February, 09 2015 10:05:36 ║ 
║ 42 ║ (null)  ║   1 ║    3 ║ Main Process 3 ║   0 ║ (null)  ║  0 ║ (null)  ║  7 ║  1 ║ February, 09 2015 10:14:36 ║ 
╚═════╩════════════╩═════════════╩════════════════╩═══════════════════╩═════════════╩═══════════════╩═══════════╩═════════════╩═══════════╩═════════╩════════════════════════════╝ 

Желаемый результат:

╔═════╦════════════╦═════════════╦════════════════╦═══════════════════╦═════════════╦═══════════════╦═══════════╦═════════════╦═══════════╦═════════╦════════════════════════════╗ 
║ id ║ parent_id ║ company_id ║ department_id ║  name  ║ user_score ║ user_comment ║ ic_score ║ ic_comment ║ position ║ status ║  date_created  ║ 
╠═════╬════════════╬═════════════╬════════════════╬═══════════════════╬═════════════╬═══════════════╬═══════════╬═════════════╬═══════════╬═════════╬════════════════════════════╣ 
║ 7 ║ (null)  ║   1 ║    3 ║ Main Process 3 ║   0 ║ (null)  ║  0 ║ (null)  ║  1 ║  1 ║ February, 02 2015 21:09:08 ║ 
║ 1 ║ (null)  ║   1 ║    3 ║ Main Process 1 ║   0 ║ (null)  ║  0 ║ (null)  ║  2 ║  1 ║ February, 02 2015 21:04:03 ║ 
║ 16 ║ 1   ║   1 ║    3 ║ Sub Process 1, 1 ║   0 ║ (null)  ║  0 ║ (null)  ║  1 ║  1 ║ February, 02 2015 21:14:34 ║ 
║ 41 ║ 1   ║   1 ║    3 ║ Sub Process 4, 1 ║   0 ║ (null)  ║  0 ║ (null)  ║  9 ║  1 ║ February, 09 2015 10:06:40 ║ 
║ 42 ║ (null)  ║   1 ║    3 ║ Main Process 3 ║   0 ║ (null)  ║  0 ║ (null)  ║  7 ║  1 ║ February, 09 2015 10:14:36 ║ 
║ 6 ║ (null)  ║   1 ║    3 ║ Main Process 2 ║   0 ║ (null)  ║  0 ║ (null)  ║  8 ║  1 ║ February, 02 2015 21:08:53 ║ 
║ 40 ║ (null)  ║   1 ║    3 ║ Main Process 2 ║   0 ║ (null)  ║  0 ║ (null)  ║  16 ║  1 ║ February, 09 2015 10:05:36 ║ 
╚═════╩════════════╩═════════════╩════════════════╩═══════════════════╩═════════════╩═══════════════╩═══════════╩═════════════╩═══════════╩═════════╩════════════════════════════╝ 
+2

Долю желаемого выход, ваше описание не ясно для меня – lad2025

+0

@ lad2025 Пожалуйста, проверьте скрипку. Идентификаторы должны быть следующими: 7, 1, 16, 41, 42, 6, 40. Сначала необходимо, чтобы все основные процессы выполнялись в позиции и в основном, все принадлежащие подпроцессы должны быть ASC с позицией – PostMans

+0

Проверьте мое право на правильность – lad2025

ответ

1

Это возможно, но вам понадобится позиция родителя в строке подпроцесса. Для этого вам необходимо подключиться к таблице процессов. Для достижения желаемой сортировки я использовал битгифтинг. Это приведет к BIGINT, при этом первые 32 бита будут отменены для позиции родительского и более поздних 32 бит, зарезервированных для положения дочернего элемента. В случае родительских строк, их собственная позиция используется в качестве позиции в течение первых 32 бит, последние 32 бита устанавливаются в 0.

Это приводит к следующему запросу:

SELECT `process`.* 
FROM `process` 
LEFT JOIN `process` AS `processParent` ON `processParent`.`id` = `process`.`parent_id` 
WHERE `process`.`company_id` = '1' AND `process`.`status` = '1'               
ORDER BY 
    (IF(`process`.`parent_id` IS NULL, `process`.`position`, `processParent`.`position`) << 32) 
    + IF(`process`.`parent_id` IS NULL, 0, `process`.`position`) ASC; 

Редактировать: Имейте в виду, что это работает только в том случае, если процесс является родителем или дочерним, но он не может быть одновременно.

+0

Спасибо за ваш комментарий. Итак, если я правильно его понимаю, поле позиции должно быть BIGINT, но как сохранить позицию (вы упомянули первые 32 бита для родительской позиции и последние 32 бита для дочернего элемента) – PostMans

+0

Вышеуказанный запрос должен дать вам желаемые результаты. Вы не должны менять позицию на BIGINT. Но при использовании bithifting MySQL автоматически создает BIGINT для вас. BIGINT имеет место для 64 бит. Таким образом, положение родителя и ребенка можно сохранить в этом BIGINT. Но не изменяйте ни одну вашу базу данных, столбцы INT отлично. –

+0

Полная удивительность! Работает!! – PostMans

1

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

SELECT p.* 
    FROM `process` p 
LEFT JOIN `process` parent 
     ON parent.id = p.parent_id 
    WHERE p.company_id = '1' AND p.status = '1' 
ORDER BY COALESCE(parent.position, p.position), 
      parent.position IS NULL DESC, 
      p.position 
+0

Спасибо, это работает также как очарование! – PostMans

Смежные вопросы