To powinno dać ci to, czego potrzebujesz... Każdy z warunków klauzuli "OR"d where możesz po prostu dodawać jako kwalifikowany element. Następnie po prostu dostosuj klauzulę „Posiadanie”, aby spełniała tę samą liczbę, co kryteria, na które zezwalasz… Najpierw umieściłem tabelę relacji, ponieważ miałaby ona mniejszy dopasowany zestaw wartości „Wartość” wartości miasta lub typu. . Upewnij się, że masz indeks w tabeli relacji w kolumnie „WARTOŚĆ”.
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
Jeśli chcesz uzyskać wszystkie rzeczywiste dane obiektu Z tych wyników, opakowuj je w sposób podobny do...
select obj.*
from
( complete SQL statement above ) PreQuery
join Object obj on PreQuery.id_obj = obj.id