While the query you describe is not impossible in SQL, it is not going to be very efficient as the query would have to evaluate every row in the table matching those keys, and then sort based on the result of the calculation.
You are better saving a fourth value and sorting on that, as suggested by @Shazzad. Something like this:
function gen_sort_meta_wpse_133851($pid) {
var_dump($pid);
$release[] = get_post_meta($pid,'release_f',true);
$release[] = get_post_meta($pid,'release_uk',true);
$release[] = get_post_meta($pid,'release_us',true);
$sort = max($release);
$release_sort = get_post_meta($pid,'_release_sort',true);
update_post_meta($pid,'_release_sort',$sort,$release_sort);
}
add_action('save_post','gen_sort_meta_wpse_133851');
You should then be able to sort with:
function orderby_additionaldate($query) {
if (! is_admin()
&& $query->is_main_query()
&& is_category( array( 2,57,530 ) )
|| cat_is_ancestor_of(2, get_query_var('cat') )
&& $query->is_main_query()
&& ! is_admin()
|| cat_is_ancestor_of(57, get_query_var('cat') )
&& $query->is_main_query()
&& ! is_admin()
|| cat_is_ancestor_of(530, get_query_var('cat') )
&& $query->is_main_query()
&& ! is_admin()
) {
if ( $query->query_vars ) {
$query->set( 'order', 'DESC' );
$query->set( 'meta_key', '_release_sort' );
$query->set( 'orderby', 'meta_value' );
}
}
}
add_action( 'pre_get_posts', 'orderby_additionaldate' );
I have no idea if that logic is correct. Long lists of unparenthesized boolean conditions is a good way to get unexpected behavior.