2016-08-31 2 views
0

나는 판매자가 판매 할 수있는 모든 제품을 포함하는 제품 테이블을 가지고 있습니다. 기본 키로 두 개의 열이 있습니다. product_codeamount (기본적으로 제품 중량).그룹에 대한 제약 조건

제품 무게가 다양하므로 가격이 다양합니다. 제품 중량은 6 종류가 있습니다 : 0.5, 1, 1.5, 2, 2.5, 3. 무게가 다른 제품의 제품 코드는 동일합니다.

샘플 데이터 :

product_code | product_quantity | amount | quantity 
1234   | 6    | 0.5kg | 0 
1234   | 6    | 1.0kg | 7 
1234   | 6    | 1.5kg | 8 

내가 모든 제품을 표시 할 만 한 번만 product_code를 당.

SELECT * FROM products where group by product_code 

위의 세 행을 감안할 때,이 쿼리는 나에게 세의 첫 번째 행을 제공합니다.

그러나 존재하는 경우 0보다 큰 수량의 행을 반환하고 싶습니다. 그렇지 않으면 행이됩니다.

이를 달성하기 위해 내 쿼리에서 어떤 수정을해야합니까? 비표준 기능을 사용하고 마음에

Table structure

+1

당신은 쓰기 : "그것은 기본 키로 product_code 및 product_weight "라는 두 개의 열이 있습니다. 이미지의 비트는'product_code'와'amount'에 키 심볼을 보았습니다. –

+0

@PaulSpiegel 죄송합니다. 방금 내 질문을 업데이트했습니다. –

답변

0

베어링, 즉 비 집계 컬럼의 서브 세트에 의해 그룹화하는 경우 (보장되지 :

여기 내 테이블 구조입니다

SELECT * FROM (
    SELECT * FROM products 
    ORDER BY quantity desc 
) x 
GROUP BY product_code 
:) 첫 번째 행은

제로 수량 전에 비 - 제로 양을 발견 정렬 된 행 세트 이상으로 그룹을 수행 ... 각 그룹에 대해 반환

참고 : 사용중인 구현 방식은 이러한 방식으로 작동하지만 이후 버전이 원하는 방식으로 안정적으로 작동한다는 보장은 없습니다. documentation에 따라 또한

:

MySQL은 5.7.5 현재로는 기본 SQL 모드는 ONLY_FULL_GROUP_BY이 포함되어 있습니다.

즉, 설치 후 ONLY_FULL_GROUP_BY을 활성화하지 않으면 쿼리가 5.7.5 이상에서 실행되지 않습니다.


신뢰성있는, 휴대용, 방법은 원하는 모든 수량을 발견하고 그 조인 하위 쿼리를 사용하는 것입니다. 다음,

SELECT p.* 
FROM products p 
JOIN (SELECT p2.product_code, max_quantity, max(amount) max_amount 
     FROM products p2 
     JOIN (SELECT product_code, MAX(quantity) max_quantity 
      FROM products 
      GROUP BY product_code) q 
     ON q.product_code = p2.product_code 
     AND max_quantity = p2.quantity 
     GROUP BY product_code, max_quantity) qa 
    ON p.product_code = qa.product_code 
    AND quantity = max_quantity 
    AND amount = max_amount 

첫 번째 하위 쿼리 (당신이 원하는 데이터가있는) 최대 수량을 발견 :하지만 당신은 수량이 제품에 고유 아니라는 것을 추가 합병증을 가지고, 그래서 당신은 양을 사용하여 넥타이를 중단해야 다음 부속 조회는 최대 수량을 가진 모든 행의 최대 양을 찾습니다 (최대 금액을 공유하는 둘 이상의 행이있을 수 있음). 제품 코드, 금액 및 수량의 조합이 고유하므로이 값을 사용하여 테이블에 다시 가입하면 원하는 행을 얻을 수 있습니다.

면책 조항 : 코드 컴파일이나 직장이 내 전화에 손때 (그러나 그것이 작동하는 합리적인 기회가있다) 당신이 가장 높은 quantityproduct_code 당 하나 개의 행을 원하는 경우에

+0

고마워. –

+0

wou; lld 당신은 x를 쿼리 내에서 설명해 주시겠습니까? –

+1

@ BOTJr. "x"(아무 것도 될 수 있음)는 모든 하위 쿼리에 별칭을 지정해야하는 구문에 필요합니다 (실제로 사용하지 않더라도). 코드가 명확 해지면 "ordered_by_quantity"와 같은 이름으로 지정할 수 있습니다. 하지만 저는 항상 "x"를 사용합니다 (대수에서 기본 변수 이름이 아닌 특별한 이유가 없기 때문에). – Bohemian

1

가 된 같은 수 없습니다 당신 WHERE 조건을 상관 하위 쿼리로 사용할 수 있습니다.이 서브 쿼리는 quantity으로 정렬되며 한 행으로 제한됩니다.

SELECT p1.* 
FROM products p1 
WHERE (p1.product_code, p1.amount) = (
    SELECT p2.product_code, p2.amount 
    FROM products p2 
    WHERE p2.product_code = p1.product_code 
    ORDER BY p2.quantity DESC 
    LIMIT 1 
) 

조건에 기본 키를 사용해야합니다.

SELECT p1.* 
FROM products p1 
WHERE p1.amount = (
    SELECT p2.amount 
    FROM products p2 
    WHERE p2.product_code = p1.product_code 
    ORDER BY p2.quantity DESC 
    LIMIT 1 
) 

지금 MySQL은 각 product_code의 하위 쿼리 결과를 캐시 할 수 있어야한다 : 우리가 하위 쿼리에 WHERE p2.product_code = p1.product_code을 가지고 있기 때문에, 우리는 또한 그것을 다시 작성할 수 있습니다. (product_code, quantity, amount)에 대한 인덱스 또는 단지 (product_code, quantity)에 대한 서브 쿼리는 매우 빠르게 실행되어야합니다.

결과를 결정적으로 유지하려면 하위 쿼리의 ORDER BY 절을 확장 할 수 있습니다. 같은 product_code 두 행이 동일한 quantity이 있고 큰 amount (이 기본 키의 일부이기 때문에 동일 두지 함) 한 후 사용과 함께 하나를 선택하려면

ORDER BY p2.quantity DESC, p2.amount DESC 
관련 문제