Возможно:
Используйте левое объединение один раз, чтобы получить значение мета 3, если оно существует, гарантируя, что вы сохраните все посты с мета1 и мета2 с желаемыми значениями.и затем используйте существующее и убедитесь, что вы получаете только записи, имеющие и meta1, и 2. с желаемыми значениями.
UNTESTED ...
SELECT P.ID, P.Title, PM.Meta_value
FROM Posts P
LEFT JOIN Post_MetaData PM
on P.ID = PM.Post_ID
and PM.key = 'meta_3'
WHERE exists (SELECT 1
FROM post_meta
WHERE ((Key 'meta_1' and meta_value = 'Value_1') OR
(Key 'meta_2' and meta_value = 'Value_2'))
and P.ID = Post_ID --Either here or an AND in the HAVING clause...need to test to know
GROUP BY Post_ID
HAVING count(*) = 2 )
ORDER BY -PM.meta_value desc, P.ID
Это предполагает, что post_metaData имеет уникальное ограничениена ключ для Post_ID.в противном случае мы можем получить meta_1 со значением a и meta1 со значением a, а count (*) будет равен 2;и неправильно вернуть его в результатах.
Чтобы последние значения были нулевыми, следуйте этому подходу; MySQL Orderby by number, Null last
Делать это как IN .... но я думаю, что это будет медленнее.
SELECT P.ID, P.Title, PM.Meta_value
FROM Posts P
LEFT JOIN Post_MetaData PM
on P.ID = PM.Post_ID
and PM.key = 'meta_3'
WHERE P.ID in (SELECT Post_meta.Post_ID
FROM post_meta
WHERE ((Key 'meta_1' and meta_value = 'Value_1') OR
(Key 'meta_2' and meta_value = 'Value_2'))
GROUP BY Post_ID
HAVING count(*) = 2 )
ORDER BY -PM.meta_value desc, P.ID