2012-01-16 3 views
0

나는 이것을하는 방법을 파악하는 데 어려움을 겪고 있습니다. 첨부 된 속성을 기반으로 한 제품의 가능한 모든 변형을 포함하는 "제품 옵션"테이블을 만들고 있습니다. 따라서 빨간색, 소형, 파란색 및 대형이 제품에 부착 된 경우 옵션은 작은 빨간색, 큰 빨간색, 작은 파란색 및 큰 파란색입니다. 이것을 위해 나는 일대 다 (one-to-many)를 뒤집어 야한다고 생각하지만, 나는 어떻게 고투하고있다.제품 옵션에 대한 Mysql "다 대일"관계?

지금은 지정된 값과 일치하는 옵션을 검색하려고합니다. 예를 들어, 빨간색과 작은 것을 검색하면 "작은 빨간색"옵션이 표시됩니다. 이 4 또는 7합니다 (작은 빨간색 값에 대한 ID를) 한 번만 중 하나와 일치하는 모든 옵션을 반환

SELECT o.name 
FROM shop_products_options o 
WHERE o.id IN (
    SELECT v.option_id 
    FROM shop_products_options_values v 
    WHERE v.product_id = 1 AND v.value_id IN(4,7) 
    GROUP BY v.option_id 
) 

이 내가 물었다 previous question에 따라 시도하고있다 것입니다. 에 정확히 일치하는 option_id를 4와 7 모두 반환하려면 어떻게해야합니까?

나는 쉼표로 분리 된 목록을 사용하여 그것을 할 수 있었지만 먼저 정상적으로 작동하는 정규화 된 방법이 있는지 확인하고 싶습니다. 어떤 조언을 해 주셔서 감사합니다. :)

답변

0

내가 잘못 이해하지 않는 한 다음과 같이 시도해보십시오. 모든 option_id에 대해 4를 검색 한 다음 7에 대해 검색하고 INTERSECT를 사용하여 둘 다 존재하는 값만 리턴하십시오.

SELECT o.name 
FROM shop_products_options o 
WHERE o.id IN (
SELECT v.option_id 
FROM shop_products_options_values v 
WHERE v.product_id = 1 AND v.value_id = 4 
GROUP BY v.option_id 

INTERSECT 

SELECT v.option_id 
FROM shop_products_options_values v 
WHERE v.product_id = 1 AND v.value_id = 7 
GROUP BY v.option_id 
) 

주 - INTERSECT는 MySQL을 지원하지 않습니다, 그래서 대안은 GROUP BY 부분이 필요하지 않을 수 있습니다 여러 하위 쿼리

SELECT o.name 
FROM shop_products_options o 
WHERE o.id IN (
SELECT v.option_id 
FROM shop_products_options_values v 
WHERE v.product_id = 1 AND v.value_id = 4 
GROUP BY v.option_id 
) 

AND o.id IN (
SELECT v.option_id 
FROM shop_products_options_values v 
WHERE v.product_id = 1 AND v.value_id = 7 
GROUP BY v.option_id 
) 

을 사용하는 것입니다

+0

나는 받고 있어요 " SQL 구문에서 "9"행에 오류가 있습니다. 하지만 각 값에 대해 INTERSECT를 반복해야합니까? 어딘가에 제한을 두어야하지만 검색 할 값의 수에는 제한이 없습니다. – Fourjays

+0

죄송합니다, MySQL을 사용하고 있습니까? INTERSECT가 지원되지 않는다는 사실을 잊어 버렸습니다. Intersect는 두 쿼리의 결과를 결합하지만 두 쿼리와 일치하는 결과 만 표시합니다. 또는 위와 같이 시도해 볼 수도 있습니다. – leejmurphy

관련 문제