2009-08-14 5 views
1

다른 테이블의 항목에 대한 메타 데이터가있는 테이블이 있습니다. 메타 데이터 테이블은 (더 분명 그래서 내가 ID를 관련 제거) 다음과 같습니다 색상블루입니다MySQL : 단일 테이블을 여러 번 검색하고 있습니까?

id entry_id property value
1 12 color blue
2 12 shape circle
3 13 color red
4 13 shape circle
5 14 color blue
6 14 shape square
7 15 material stone
8 12 material plastic

가 지금은 모든 항목을 선택처럼, 특성에 대해이 테이블을 검색 할 :

select entry_id from table where property = 'color' and value = 'blue'

지금까지 너무 좋아. 하지만 여러 조건이있을 때 어떻게 쿼리를 확장합니까? 색상블루모양입니다입니다 예를 들어 나는 모든 항목을 검색합니다. 지금은 노동 조합에이를 것이 분명 내가 찾는 할 이상의 속성 추한 도착

select entry_id from table where property = 'color' and value = 'blue'
union
select entry_id from table where property = 'shape' and value = 'circle'

합니다. 그리고 그것은 너무 빠르지 않다고 생각합니다. 이 일을 더 우아한 방법이 있습니까? 이 테이블의 이유는 사용자가 설정할 수있는 메타 데이터가있는 개체가 있기 때문입니다.

감사합니다.

+0

당신이 취하는 해결책이 무엇이든간에 성과를 얻으려면 (entry_id, property, value)에 색인을 만들어야합니다. 이 트리플이 이미 기본 키가 아닌 경우. –

답변

1

이 무엇입니까? 의

select distinct 
    entry_id 
from 
    table t 
where 
    exists (select 1 from 
       (select 'shape' as property, 'circle' as value 
       union all 
       select 'color' as property, 'blue' as value) s 
      where 
       s.property = t.property 
       and s.value = t.value) 

사용 하나 : 당신은 또한 exists을 시도 할 수 있습니다

select distinct 
    entry_id 
from 
    table t 
    inner join 
     (select 'shape' as property, 'circle' as value 
     union all 
     select 'color' as property, 'blue' as value) s on 
     t.property = s.property 
     and t.value = s.value 

:

select 
    distinct e1.entry_id 
from 
table e1 
inner join 
    table e2 on e1.entry_id=e2.entry_id 
where 
    e1.property='color' and 
    e1.value='blue' and 
    e2.property='shape' and 
    e2.value='circle' 
+0

DISTINCT entry_id의 – Martijn

+0

을 선택하면 고유 ID를 선택해야합니다. ID 12는 두 번 다시 올 것이며, 그의 UNION 문은 복제를 무시합니다. – Andrew

+0

나는 이전 쿼리가 반환 한 바가 무엇이냐고 물었던 것을 선택하도록 수정했다. (그가 원하는 바란다.) –

0
SELECT a.entry_id 
FROM table a INNER JOIN table b USING (entry_id) 
WHERE a.property = 'color' AND a.value = 'blue' 
    AND b.property = 'shape' AND b.value = 'circle' 
+0

감사합니다. – acme

+0

@acme godd performace를 얻으려면 (entry_id, property, value)에 색인을 만들어야합니다. 이 트리플이 이미 기본 키가 아닌 경우. –

0

당신은 union 또는 or 대신에 해시 테이블을 구축에 MySQL을 속일 수 이 두 가지 방법으로, 당신은 당신의 작은 마음 욕망만큼 많은 검색 조건을 추가 할 수 있습니다. 다른 union all에서 s 하위 쿼리를 단순히 붙이면됩니다.

+0

감사합니다, 내가 기대할 수있는 성능 문제가 있습니까? – acme

+0

및 어떻게 이러한 meethods 필드에서 "같은"검색을 얻을 수 있습니까? – acme

+0

이들은 실제로 매우 효과적이어야합니다. 'like'에 관해서는, 당신이't.property like '%'+ s.property + '%''와 같이 할 수 있습니다. 그것은 단지 조인 조건이므로, 필요하다면 그걸로 견과를 가져 가라. – Eric

관련 문제