복붙노트

[SQL] SQL 쿼리 : 대신 하위 쿼리의 "AND"를 통해 여러 행 시뮬레이션

SQL

SQL 쿼리 : 대신 하위 쿼리의 "AND"를 통해 여러 행 시뮬레이션

tagid 및 콘텐츠 ID를 : 나는 두 개의 열이있는 "태그"테이블이 있다고 가정. 각 행은 내용의 조각에 할당 된 태그를 나타냅니다. 나는 나에게 tagids 334, 338, 342 태그 콘텐츠의 모든 조각의 콘텐츠 ID를 줄 것이다 쿼리를합니다.

될이 작업을 수행하는 "쉬운"방법 (의사) :

select contentid from tags where tagid = 334 and contentid in (
    select contentid from tags where tagid = 338 and contentid in (
        select contentid from tags where tagid = 342
    )
)

그러나, 내 직감이 작업을 수행하려면 더 확장 방법은 빠르고, 더 나은가 있음을 알려줍니다. 예를 들어, 나는 12 개 태그의 교차점을 찾기 위해 필요한 어떤 경우? 이 신속 끔찍한 얻을 수 있습니다. 어떤 아이디어?

편집 :이 또한이 우수한 블로그 게시물에 포함되어 있음을 밝혀졌습니다.

해결법

  1. ==============================

    1.

    SELECT contentID
    FROM tags
    WHERE tagID in (334, 338, 342)
    GROUP BY contentID
    HAVING COUNT(DISTINCT tagID) = 3
    
    
    --In general
    SELECT contentID
    FROM tags
    WHERE tagID in (...) --taglist
    GROUP BY contentID
    HAVING COUNT(DISTINCT tagID) = ... --tagcount
    
  2. ==============================

    2.여기 개체 및 태그의 매우 큰 데이터베이스에 나를 위해 훨씬 빠르게보다 더 가공 한 솔루션입니다. 이 세 태그 교차로에 대한 예입니다. 그것은 단지 체인 많은 사람들이 동일한 개체를 나타 내기 위해 객체 태그 테이블 (objtags)에 조인 및 WHERE 절에 태그 ID를 규정 :

    여기 개체 및 태그의 매우 큰 데이터베이스에 나를 위해 훨씬 빠르게보다 더 가공 한 솔루션입니다. 이 세 태그 교차로에 대한 예입니다. 그것은 단지 체인 많은 사람들이 동일한 개체를 나타 내기 위해 객체 태그 테이블 (objtags)에 조인 및 WHERE 절에 태그 ID를 규정 :

    SELECT w0.objid
    
    FROM       objtags t0
    INNER JOIN objtags t1 ON t1.objid=t0.objid
    INNER JOIN objtags t2 ON t2.objid=t1.objid
    
    WHERE t0.tagid=512
      AND t1.tagid=256
      AND t2.tagid=128
    

    이 빠르게 실행 내가 왜 아무 생각이 없습니다. 그것은 뮤직 브레인 서버에서 검색 코드에 의해 영감을했다. 포스트 그레스에서 이렇게, 나는 보통 HAVING COUNT (...) 솔루션을 통해 ~ 8-10x 속도 향상을 얻을.

  3. ==============================

    3.나는이 생각할 수있는 유일한 다른 방법 :

    나는이 생각할 수있는 유일한 다른 방법 :

    select a.contentid from tags a
    inner join tags b on a.contentid = b.contentid and b.tagid=334
    inner join tags c on a.contentid = c.contentid and c.tagid=342
    where a.tagid=338
    
  4. ==============================

    4.이 더 나은 경우 나도 몰라하지만 더 유지 보수 수 있습니다

    이 더 나은 경우 나도 몰라하지만 더 유지 보수 수 있습니다

    select contentid from tags where tagid = 334
    intersect
    select contentid from tags where tagid = 338
    intersect
    select contentid from tags where tagid = 342
    

    당신은 원래의 솔루션으로 나쁜로하지 않을 것이다 동적으로 구축해야 할 것이다.

  5. ==============================

    5.SQL 유형은 무엇? MS SQL 서버, 오라클, MySQL은?

    SQL 유형은 무엇? MS SQL 서버, 오라클, MySQL은?

    에서 SQL Server는이 동일시하지 않는다 :

    select contentid from tags where tagid IN (334,338,342)
    
  6. from https://stackoverflow.com/questions/163887/sql-query-simulating-an-and-over-several-rows-instead-of-sub-querying by cc-by-sa and MIT license