2013-05-26 6 views
1

SQL 쿼리를 따르기 만하면됩니다. 얻을 수있는 방법이 있습니까?mySql 쿼리의 형식 단순화

select * 
    from product a 
    where a.brand_id 
    in (select ib.brand_id from 
     SUBSCRIBED_CHANNEL ia inner join product ib 
     where ia.product_id=ib.product_id and ia.user_id=3) 
    and a.product_id not in (select ib.product_id from SUBSCRIBED_CHANNEL ia 
    inner join product ib where ia.product_id=ib.product_id and ia.user_id=3) 

편집 : 네 개의 테이블 :

제품 (PRODUCT_NAME, PRODUCT_ID, BRAND_ID)
SUBSCRIBED_CHANNEL (USER_ID, PRODUCT_ID)
브랜드 (BRAND_NAME, BRAND_ID)
사용자 (..., USER_ID)

제품을 위해 -> many to one
제품 -> many to many
subscribed_channel -> 중간 테이블


사용자가 가입하지 않은 제품을 구입해야합니다.
예 : Nike Brand의 제품이 xx, yy 및 zz 인 경우
사용자가 xx에만 가입하면 내 쿼리는 yy, zz 만 제공해야합니다.

+0

소식이 [EXTENDED EXPLAIN (http://dev.mysql.com/doc/refman/5.0/en/ explain.html) 또는 이것이 저장 프로 시저의 일부인 경우 [analyze()] (http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html)를 참조하십시오. – hd1

+0

조인하는 방법을 읽어보십시오. 에있는 모든 사람들은 아마도 개 doo doo처럼 수행 할 것입니다 – Drew

+0

이 쿼리가 무엇을 하려는지 설명해 주시겠습니까? 나는 그것을 표현하는 쉬운 방법이 있다고 생각한다. 그러나 그것을 읽으면 제품이나 구독 채널에 얼마나 많은 브랜드가 있는지에 대해 꽤 분실하게됩니다. –

답변

0

(개정) 시도 : 또는

select distinct a.* 
from product a 
join product b on a.brand_id = b.brand_id 
join subscribed_channel i on b.product_id = i.product_id and i.user_id=3 
left join subscribed_channel n on a.product_id = n.product_id and n.user_id=3 
where n.product_id is null 

:

select a.* 
from product a 
join product b on a.brand_id = b.brand_id 
join subscribed_channel i on b.product_id = i.product_id and i.user_id=3 
group by a.product_id 
having sum(case when a.product_id = b.product_id then 1 else 0 end) = 0 
+0

가장 좋은 방법이 있습니까? – Nihanth

+0

@Nihanth : 마지막 코멘트를 명확히 할 수 있습니까? 이 대답은 하위 쿼리 대신 조인 만 사용하여 기존 쿼리의 기능을 복제해야합니다. 기존 쿼리보다 더 잘 수행 될 수도 있습니다. (a) 기능과 일치한다는 것이 행복하다는 점, (b) 성능이 더 좋을 때 (brand_id에서 제품에 제품을 결합한 경우) 성능이 저하 될 수 있음을 확인하는 것은 개발자의 책임입니다. –

+0

감사 마크 ... 두 번째 ans를 선택했는데 내 쿼리가 성능이 현저한 이유를 알 수 있습니까? – Nihanth