Порядок, в котором Вы объединяющие таблицы или Вы помещаете Ваш НА / ГДЕ условия не должны иметь значения.
оптимизатор запросов должен оптимизировать и использовать лучший порядок так или иначе (и chosing, как лучше всего отфильтровать данные, где запустить, и т.д.)
Как многие другие, хотя, я предлагаю использовать синтаксис ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ, так как это делает вещи намного более читаемыми, это более прозрачно с синтаксисом ЛЕВЫХ или ПОЛНЫХ соединений также.
существует несколько больше живущего текста об этом здесь: http://linus.brimstedt.se/?/article/articleview/SQL Синтаксис
/B
У вас должна быть возможность перебирать желаемую сортировку в обратном порядке:
list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]
list = list.sort{ a,b -> a[2] <=> b[2] }
list = list.sort{ a,b -> a[1] <=> b[1] }
list = list.sort{ a,b -> a[0] <=> b[0] }
assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
Каждый должен перекрывать предыдущий ровно настолько, чтобы объединенная сортировка оставалась нетронутой.
Вы также можете объединить их в цепочку. порядок с оператором Элвиса, ?:
, который будет перенесен на следующее сравнение, когда предыдущее будет равно (и <=>
вернет 0
) :
list.sort { a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] }
Если вы хотите отсортировать массивы произвольной (хотя и однородной) длины, вы можете использовать это, и он сделает это за один проход:
def list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]
list.sort { a, b ->
for (int i : (0..<a.size())) {
def comparison = (a[i] <=> b[i])
if (comparison) return comparison
}
return 0
}
assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
Вот то, что я придумал, думаю, не из самых удачных способов ..
list = list.sort{ a,b ->
if(a[0].compareTo(b[0]) == 0) {
if(a[1].compareTo(b[1]) == 0) {
return a[2].compareTo(b[2]);
} else {
return a[1].compareTo(b[1]);
}
} else {
return a[0].compareTo(b[0]);
}
}
вы можете использовать библиотеку CollectionUtils kobo-commons.
https://github.com/kobo/kobo-commons/wiki/sort-by-multiple-keys
import org.jggug.kobo.commons.lang.CollectionUtils
CollectionUtils.extendMetaClass()
list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]
list = list.sort{ [ it[0], it[1], it[2] ]} // sort by multiple keys
assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
list2 = [ [name:"a", age:13], [name:"a",age:15], [name:"b", age:13] ]
list2 = list2.sort{[it.name, it.age] } // sort by name and age
assert list2 == [[name:"a", age:13], [name:"a", age:15], [name:"b", age:13]]