В MariaDB у вас есть функция ifnull , и вы можете использовать ее как
ifnull(expr1, expr2)
, что фактически говорит:
expr2
Если я хорошо понимаю вашу проблему, то ваше решение выглядит следующим образом:
order by ifnull(vdad.vrm_document_id, ifnull(vd.timestamp_modified_utc, someothervalue)) desc
В приведенном выше пункте someothervalue представляет любое поле, которое вы можете использовать по умолчанию. Желаемые критерии были неясны для меня. Однако, если вы хотите, чтобы документ по умолчанию был самым первым критерием, тогда
ORDER BY dv.is_default_document desc, vdad.vrm_document_id DESC, vd.timestamp_modified_utc DESC
или, если вы хотите, чтобы это был самый последний критерий, тогда
ORDER BY vdad.vrm_document_id DESC, vd.timestamp_modified_utc DESC, dv.is_default_document desc
РЕДАКТИРОВАТЬ
SELECT vdad.*, vd.*
FROM `vrm_document` AS `vd`
LEFT JOIN vrm_document_active_document AS vdad ON (vd.vrm_document_id = vdad.vrm_document_id AND vd.user_id = vdad.user_id)
WHERE ((`vd`.`parent_vrm_document_id` = 1 AND `vd`.`user_id` IN (2,18,21)) OR (`vd`.`vrm_document_id` = 1 ) )
ORDER BY
CASE not exists (
SELECT 1 as cnt
FROM `vrm_document` AS `vd2`
LEFT JOIN vrm_document_active_document AS vdad2 ON (vd2.vrm_document_id = vdad2.vrm_document_id AND vd2.user_id = vdad2.user_id)
WHERE ((`vd2`.`parent_vrm_document_id` = 1 AND `vd2`.`user_id` IN (2,18,21)) OR (`vd2`.`vrm_document_id` = 1 ) )
AND not ((vdad2.vrm_document_id is null) AND (vdad2.user_id))
)
WHEN 1 THEN vd.vrm_document_id
ELSE 0 END,
vdad.vrm_document_id DESC,
vd.timestamp_modified_utc DESC
В приведенном выше запросе используется case-when-else-end для проверки существования некоторых записей. Для меня неясно, какими должны быть точные критерии, но даже если приведенный выше пример не является вашим точным соответствием, вы можете заменить
AND not ((vdad2.vrm_document_id is null) AND (vdad2.user_id))
на то, что вам нужно, и оно должно работать.
EDIT2
Текущий запрос по умолчанию сортируется по двум критериям в вопросе, но если первые два столбца имеют значение NULL, то самым первым элементом будет документ по умолчанию:
SELECT vdad.*, vd.*
FROM `vrm_document` AS `vd`
LEFT JOIN vrm_document_active_document AS vdad ON (vd.vrm_document_id = vdad.vrm_document_id AND vd.user_id = vdad.user_id)
WHERE ((`vd`.`parent_vrm_document_id` = 1 AND `vd`.`user_id` IN (2,18,21)) OR (`vd`.`vrm_document_id` = 1 ) )
ORDER BY
CASE not exists (
SELECT 1 as cnt
FROM `vrm_document` AS `vd2`
LEFT JOIN vrm_document_active_document AS vdad2 ON (vd2.vrm_document_id = vdad2.vrm_document_id AND vd2.user_id = vdad2.user_id)
WHERE ((`vd2`.`parent_vrm_document_id` = 1 AND `vd2`.`user_id` IN (2,18,21)) OR (`vd2`.`vrm_document_id` = 1 ) )
AND not ((vdad2.vrm_document_id is null) AND (vdad2.user_id))
)
WHEN 1 THEN vd.is_default_document
ELSE 0 END desc,
vdad.vrm_document_id DESC,
vd.timestamp_modified_utc DESC