2012-01-26 4 views
2

나는 어떤 종류의 여분의 키가있는 제품 테이블을 가지고 있으며, 분석 및 물건에 사용되는 값이 있습니다. 내 문제는 특정 키를 사용하여 제품을 쉽게 찾을 수 있다면 키를 찾지 못하도록하는 것이 훨씬 더 까다로운 것입니다. 키가 없습니다. 이야기를 자르고 코드를 보여 드리자.관련 키가없는 요소 찾기

SELECT products.* 
    FROM products 
    JOIN metas ON products.id = metas.product_id 
    WHERE 
     metas.key = 'mykey' AND 
     metas.value = '1' 

내가 지정 값 1 (아래의 예 1)로 설정 의 mykey 키를 사용하여 모든 제품을 얻을 것이다.

마이 키 (아래 예제의 2)이없는 모든 제품을 얻고 싶습니다. 키가 설정되어 있지 않으면 메타 테이블에 요소가 없습니다.

+-------------+  +----------------------------+ 
| products |  | metas      | 
+=============+  +============+=======+=======+ 
|id   |  | product_id | key | value | 
+-------------+  +------------+-------+-------+ 
| 1   |  | 1   | mykey | 1  | 
| 2   |  | 1   | foo | bar | 
+-------------+  +------------+-------+-------+ 

추가 점없이 하위 select 경우 그 과정에서 상처.

답변

3

NOT EXISTS을 사용하는 것이 좋습니다.

SELECT p.* 
FROM products as p 
WHERE NOT EXISTS (SELECT m.product_id 
        FROM metas AS m 
        WHERE m.key = 'mykey' 
          AND m.value = '1' 
          AND m.product_id = p.product_id) 
+1

여분의'SELECT'가 없으면 정말 불가능합니다. 고마워 친구. – greut

0

난 당신이 후 것뿐만 아니라 NULL에 대한 LEFT JOIN 및 테스트를 사용하여 이해하는 경우 :

SELECT products.* 
FROM products 
LEFT JOIN metas ON products.id = metas.product_id 
WHERE 
    (metas.key = 'mykey' AND metas.value = '1') 
    OR mets.key IS NULL 

이 동시에 (질문에서 명확하지에서 이러한 조건을 모두하지 않으려면) WHERE 절의 첫 번째 부분을 제거하고 NULL에 대해서만 테스트하십시오.

SELECT products.* 
FROM products 
LEFT JOIN metas ON products.id = metas.product_id 
WHERE 
    metas.key IS NULL 
+0

문제는 (당신이 질문에서 볼 수)에 가입하는 것이 없기 때문에 (심지어'left'를 사용하여) 그 행이 METAS 테이블에 존재하지 않기 때문에 가입하지 않는다는 것입니다 . 나는 여기에 가능한 subselect가 없다고 생각한다. – greut

+0

@greut 그것이 바로 왼쪽 조인입니다. 오른쪽 테이블에 일치 (NULL)가 없더라도 행은 왼쪽 테이블에 리턴됩니다. 너 해봤 니? –

+0

그들은 내가 신경 쓰지 않는 다른 열쇠입니다. – greut