Isso deve fornecer o que você precisa... Cada uma das condições da cláusula "OR"d where, você pode continuar adicionando como um item qualificado. Em seguida, basta ajustar a cláusula "Having" para atender ao mesmo número que os critérios que você está permitindo ... Coloquei a tabela de relações primeiro, pois isso teria um conjunto de correspondência menor no "Valor" da Cidade ou valores de tipo .. . Certifique-se de ter um índice na tabela de relações na coluna "VALUE".
SELECT STRAIGHT_JOIN
rel.id_obj
from
relations rel
join attributes atr
on rel.id_addr = atr.id
where
( rel.value = 'Apartment' AND atr.name = 'Type' )
or ( rel.value = 'Some City' AND atr.name = 'City' )
group by
atr.id_obj
having
count(*) = 2
limit
0, 20
Se você quiser que todos os dados reais do objeto A partir desses resultados, você o envolva algo como ...
select obj.*
from
( complete SQL statement above ) PreQuery
join Object obj on PreQuery.id_obj = obj.id