2012-12-20 2 views
1

나는 다음 표 (간체, 제거 불필요한 열)이 있습니다중첩 된 MySQL 쿼리에서 최적화가 가능합니까?

packageTransactions을

| memberID | subscriptionType | 
| ==========|===================| 
| 12345  | 101    | 
| 12345  | 203    | 
| 12346  | 101    | 
| 12347  | 101    | 
| 12348  | 101    | 
| 12348  | 203    | 
| 12349  | 203    | 
| 12345  | 205    | 

내가 하지subscriptionType = 101, 그 곳에있는 모든 기록을 조회 할 subscriptionType = 101에 해당하는 레코드가 memberID 존재합니다.

따라서 나는 사용 : 몇 thousend 기록이있는 테이블에이 쿼리를 사용하는 경우, 그러나

| memberID | subscriptionType | 
| ==========|===================| 
| 12345  | 203    | 
| 12348  | 203    | 
| 12345  | 205    | 

(: 나에게 내가 찾고 결과 집합을 제공

SELECT memberID, subscriptionType 
    FROM packageTransactions 
WHERE memberID IN 
    (SELECT memberID 
     FROM packageTransactions 
     WHERE subscriptionType = '101' 
    ) 
    AND subscriptionType <> '101' 
; 

+ 30k), 결과를 반환하는 데 몇 분이 걸립니다.

"better"/more 효율적인 방법으로 데이터를 쿼리하는 것이 궁금합니다.

+0

SELECT MEMBERID, subscriptionType입니다. 이것을 시도 했습니까? 왜 당신은 어디에서 사용하고 있습니까? –

+0

죄송합니다, 영어는 제 모국어가 아닙니다. 나는 그 질문에서 더 명확하게하려고 노력했다. 왜냐하면'memberID' 만 얻고 싶기 때문에'subscriptionType' = '101'레코드도 일반적으로 존재합니다. 예를 들어 memberID 12349는'subscriptionType = '101'에 대한 레코드가 없으므로 ** not **를 반환해야합니다. – eyecatchUp

답변

1

이을 시도해보십시오!

여기
SELECT pt2.memberID, pt2.subscriptionType 
FROM packageTransactions pt1 inner join packageTransactions pt2 
    ON pt1.memberID = pt2.memberID 
WHERE 
    pt1.subscriptionType = '101' AND pt2.subscriptionType <> '101' 

; 
1

는 WHERE subscriptionType = '101'packageTransactions의 FROM SQLFiddle demo

select t.* from packageTransactions t 
join 
(
    select distinct memberID 
    from packageTransactions 
    where subscriptionType = 101 
) t1 on t.memberId= t1.memberId 
where 
    (subscriptionType <> 101) 
+0

감사합니다. 귀하와 Omar 모두 솔루션이 훨씬 더 빠릅니다. 그러나 이제는 어느 쿼리가 더 적합하고 - 더 중요한지 궁금합니다 - 왜? – eyecatchUp

관련 문제