2013-10-10 4 views
0

Мне нужно запросить и отсортировать записи на основе условия. У меня есть таблицы:Заказ MySQL на основании условия

  • TASKS (id, date_due, created_at, ...) и
  • TASK_DEPENDENCIES (task_id, dependency_task_id), многие-ко-многим таблицы, где TASK_ID зависимость и dependency_task_id являются FKS к таблице ЗАДАЧ.

Обычно я запрашивал задачи и заказывал их по date_due. Но так как у нас есть зависимости задачи Я хотел бы заказать так:

  • первых задачи, которые не имеют зависимостей заказанных date_due
  • следующей задачи с зависимостями заказанных date_due

Решения есть сейчас заключается в том, что я просто создаю 2 отдельных запроса и передаю их в таблицу. Можно ли это сделать только с одним запросом и насколько эффективным (быстрым) он будет?

UPDATE:

Non-dependcy задача моего существующего SQL в

SELECT T.id, TD.dependency_task_id FROM tasks T 
LEFT OUTER JOIN task_dependencies TD ON T.id = TD.task_id 
WHERE assigned_user_id=1 AND TD.dependency_task_id IS null 
ORDER BY T.date_due 

Depencecy задача:

SELECT T.id, TD.dependency_task_id FROM tasks T 
LEFT OUTER JOIN task_dependencies TD ON T.id = TD.task_id 
WHERE assigned_user_id=1 AND TD.dependency_task_id IS NOT null 
ORDER BY T.date_due 
+1

Вопросы просящих кода должны продемонстрировать минимальный понимание проблемы. Включите попытки решения, почему они не работают и ожидаемые результаты. – Kermit

+0

Я заметил, что мое существующее решение работает, мне просто интересно, можно ли это сделать с помощью 1 запроса! –

+1

Вам нужно добавить существующее решение на ваш вопрос. – Kermit

ответ

1

Вы можете использовать выражение в вашем ORDER BY пункта. Допустим, у вас есть соединение, где вы используете таблицу TASK_DEPENDENCIES под названием «DEP». В вашем ORDER BY предложения, использовать что-то вроде этого:

ORDER BY IF(DEP.task_id IS NULL, 0, 1), date_due 

Это упорядочивает все задачи без зависимостей первой (по date_due), а затем задачи с зависимостями впоследствии (также date_due).

+0

Спасибо, это похоже на работу, но я считаю его 'IF' вместо' IIF'? –

+0

Вы правы - я недавно использовал много MSSQL2012. Я отредактировал свое сообщение, чтобы отразить синтаксис MySQL. – Dan

0

Нет причин иметь два запроса. LEFT JOIN заботится либо о scenerio. Вам просто нужно еще один столбец для сортировки, на основе значения NULL или нет

SELECT T.id, TD.dependency_task_id, ISNULL(TD.dependency_task_id) AS NoDependency, T.datedue 
FROM tasks T 
LEFT OUTER JOIN task_dependencies TD 
    ON T.id = TD.task_id 
WHERE assigned_user_id=1 
ORDER BY NoDependency DESC, T.date_due 

Производительность должна быть почти в два раза быстрее, так как это только половина запросов

+0

Я получаю сообщение об ошибке с вашим запросом: неверный счетчик параметров в вызове функции native 'IFNULL' –

+0

извините - должно быть ISNULL – AgRizzo

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