これにより、必要なものが得られるはずです...「OR」d where句の条件のそれぞれは、修飾されたアイテムとして追加し続けることができます。次に、許可する基準と同じ数を満たすように「Having」句を調整します... Cityまたはtypevaluesの「Value」に一致するセットが小さいため、リレーションテーブルを最初に配置しました。 。「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
この結果からすべての実際のオブジェクトデータが必要な場合は、次のようにラップします...
select obj.*
from
( complete SQL statement above ) PreQuery
join Object obj on PreQuery.id_obj = obj.id