2017-10-18 13 views
1

테이블 A에서 1 행, 테이블 B에서 여러 행을 반환하는 MySQL 왼쪽 결합 쿼리가 있습니다.이 행에 WHERE 절이 여러 개 있어야하며 모든 B 행 시합.MySQL 여러 개의 왼쪽 결합 행을 사용하는 경우

나는이 :

SELECT 

mage_sales_order.entity_id 

FROM mage_sales_order 

LEFT JOIN mage_sales_order_item 
ON mage_sales_order.entity_id = mage_sales_order_item.order_id 

WHERE 

mage_sales_order_item.sku NOT LIKE '1-%' 
AND mage_sales_order_item.sku LIKE '2-%' 

## Group order IDs together 
GROUP BY entity_id 

그러나 이것은 SKU는이 "1"로 시작하는 항목이있는 경우에도 "2"로 시작하는 항목이있는 순서를 반환합니다. "2"로 시작하는 항목 만 가진 주문이 반환되도록하고 싶습니다. 예를 들어

:

반환해야합니다

  • 주문 1 (mage_sales_order)
    • 2 sampleA-SKU (mage_sales_order_item)
    • 2 sampleB-SKU (mage_sales_order_item)
,210

는 반환하지 않나요 :

  • 주문 1 (mage_sales_order)
    • 1 샘플 SKU (mage_sales_order_item)
    • 2 sampleA-SKU (mage_sales_order_item)
    • 2 sampleB- SKU (mage_sales_order_item) 등

내가 이 질문은 이미 제기되었지만 검색을 시도하는 것은 어렵다는 것을 증명합니다.

+0

왜'AND' 전에'mage_sales_order_item.sku이 '1 %'를 좋아하지'? –

+1

@ KaushikNP이 질문에 대한 SQL을 단순화하고 제거하는 것을 잊었 기 때문에 (지금 편집)! –

답변

1

당신은 그 행, 예를 제외하는 다른 하위 쿼리를 추가 할 수 있습니다

SELECT mage_sales_order.entity_id 
FROM mage_sales_order 
LEFT JOIN mage_sales_order_item 
ON mage_sales_order.entity_id = mage_sales_order_item.order_id 
WHERE mage_sales_order_item.sku LIKE '2-%' 
AND mage_sales_order_item.order_id NOT IN (
    SELECT order_id FROM mage_sales_order_item WHERE sku LIKE '1-%' 
) 
GROUP BY entity_id; 
0

난 당신이 HAVING 절에 WHERE 절에 논리를 이동할 필요가 있다고 생각 :

SELECT 
    t1.entity_id 
FROM mage_sales_order t1 
LEFT JOIN mage_sales_order_item t2 
    ON t1.entity_id = t2.order_id 
GROUP BY 
    t1.entity_id 
HAVING 
    SUM(CASE WHEN t2.sku NOT LIKE '2-%' THEN 1 ELSE 0 END) = 0; 

논리를 현재 WHERE 절의 문제는이 논리가 개별 레코드에 적용된다는 것입니다. SKU가 2-으로 시작해야하고 1-으로 시작하지 않아야한다고 말하는 것은 이치에 맞지 않습니다. 이는 이전 상태가 이미 후자를 보장하기 때문입니다. 그러나 엔티티에 대한 집계의 컨텍스트에서 취한 논리는 의미가있는 것처럼 보입니다.

0

당신은 단순히 JOINWHERE 절에서 조건을 이동할 수 있습니다

SELECT mage_sales_order.entity_id 
FROM mage_sales_order 
LEFT JOIN mage_sales_order_item 
ON 
    mage_sales_order.entity_id = mage_sales_order_item.order_id 
    AND mage_sales_order_item.sku NOT LIKE '1-%' 
    AND mage_sales_order_item.sku LIKE '2-%' 
WHERE mage_sales_order_item.order_id IS NOT NULL 
GROUP BY entity_id 
+0

SKU가'2-'로 시작하는 경우 정의에 따라'1-'로 시작할 수 없으므로 적어도 조인 조건 중 하나를 제거 할 수 있습니다. –