2011-01-26 5 views
2

두 개의 IN() 연산자를 전달하는 기준으로 행을 선택하려고했지만 동일한 열에 대해서는 선택하려고합니다. 다음은 시도한 내용입니다.두 개의 IN() 연산자, 하나의 열

SELECT DISTINCT `product_id`, `department` 
    FROM `products` 
WHERE `department` IN ('Star Wars', 'Scarface', 'Winnie the Pooh') 
    AND `department` IN ('T-Shirts', 'Frisbees', 'Waffles') 

쿼리 결과가 없습니다.

products 테이블에는 두 개의 중요한 열, 즉 product_iddepartment이 포함되어 있습니다. 동일한 제품을 여러 부서에 할당합니다. 예를 들어, 스타 워즈 (Star Wars), 티셔츠 (T-Shirts), 와플 (Waffles)의 세 부서에 배정 된 다스 베이더 티셔츠가 있습니다.

사용자가 "Darth Vader"를 검색하고 "Star Wars"및 "T-Shirt"부서의 결과 만 반환하도록 지정하는 양식을 만들고 있으며 다른 모든 Darth Vader는 건너 뜁니다. 기념품.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

+0

'department'은 VARCHAR입니까? 한 제품을 여러 부서에 어떻게 할당합니까? 'product_id'가 기본 키가 아닌가? 샘플 행을 볼 수 있습니까? – webbiedave

+0

'department'에는 현재 쉼표로 구분 된 목록이 있습니까? 그렇다면'productid','departmentid'를 가진 접합 테이블이 이것을 구조화하는 가장 좋은 방법이 될 것입니다. –

+0

아니면 각 제품에 대해 두 가지 이상의 기록이 있고 스타 워즈와 티셔츠가 기록한 제품을 찾고 싶습니까? 하지만 다른 기록은 없습니까? – Rup

답변

3

WHERE IN (...)where x='a' or x='b' or x='c'...과 동등합니다. 이중화로 수행 한 작업은 "부서는 두 번째 세트의 첫 번째 세트와 두 번째 세트 중 하나 여야합니다. 기본적으로"1은 2가 3입니다. "

2

실제로 데이터베이스 구조는 다음과 같습니다. 다소 이상한. 당신은 그들을 연결하는 것 products 테이블과 departments 테이블과 마지막 테이블 product_to_deptt이 있어야합니다.

그런 식으로, 당신이 원하는 일을하는 것은 매우 쉬울 것이다.

1

당신은 모두를 포함해야 관련 부서를 IN 문으로 겹쳐 쓰는 경우가 아니면 SELECT에만 의도적으로 시도하고있는 경우가 아니라면 t 위와 같은 구문을 사용하고 다음을 고려하십시오. OR

0

부서가 하나의 목록에 있고 두 번째 목록에있는 제품을 찾고 있습니다. 두 부서리스트는 상호 배타적 가정하면, 내부 자체는 AND 조건에 사용할 수 있습니다 조인 :

select p1.product_id 
    from products p1 
     inner join products p2 
      on p1.product_id = p2.product_id 
       and p2.department in ('T-Shirts', 'Frisbees', 'Waffles') 
    where p1.department in ('Star Wars', 'Scarface', 'Winnie the Pooh') 
1
SELECT * 
    FROM `products` 
WHERE `department` IN ('Star Wars', 'T-Shirts') 
    AND whatever_it_is = 'Darth Vader';