2014-10-13 4 views
1

판매되는 모든 제품을 선택하는 쿼리가 있습니다. 내가 원하는 것은 질의를 되돌리고 일정 기간 내에 판매되지 않는 모든 제품을 얻는 것입니다.어떤 종류의 JOIN을 사용할 수 있습니까? mysql

일정 기간 내에 판매 된 모든 제품에 대한 쿼리입니다.

SELECT 
    product.product_id, 
    product.product_brand_id, 
    product.product_model_id, 
    product.product_subcategory_id, 
    product.product_retail_price, 
    product.product_wholesale_price, 
    product.product_aretail_price, 
    product.product_awholesale_price, 
    product.product_oretail_price, 
    product.product_owholesale_price, 
    product.product_quoted_price, 
    product.product_aquoted_price, 
    product.product_dquoted_price, 
    product_sold.product_type, SUM(product_sold.product_quantity) AS product_quantity_sold, SUM(product_sold.product_total_price) AS total_price_sold 
FROM product 
INNER JOIN product_sold 
    ON product.product_id = product_sold.product_id 
    AND product.product_subcategory_id = '$subcategory_id' 
INNER JOIN sales 
    ON sales.sales_id = product_sold.product_sales_id 
WHERE sales.sales_approved = '1' 
    AND sales.sales_approved_time > '$start_timestamp' 
    AND sales.sales_approved_time < '$end_timestamp' 
GROUP BY product_sold.product_type, product.product_id 
ORDER BY SUM(product_sold.product_quantity) DESC 

누군가가 팔리지 않는 제품을 얻는 방법에 대한 안내를 제공 할 수 있습니까? 여기에 아이디어가 없습니다. 감사.

답변 :

   SELECT 
        p.product_id, 
        p.product_brand_id, 
        p.product_model_id, 
        p.product_subcategory_id, 
        p.product_retail_price, 
        p.product_wholesale_price, 
        p.product_aretail_price, 
        p.product_awholesale_price, 
        p.product_oretail_price, 
        p.product_owholesale_price, 
        p.product_quoted_price, 
        p.product_aquoted_price, 
        p.product_dquoted_price, 
        pq.product_stock_type 
       FROM 
        product p 
       LEFT JOIN 
        product_sold ps 
       ON 
        p.product_id = ps.product_id 
       INNER JOIN 
        product_stock pq 
       ON 
        p.product_id = pq.product_id 
       AND 
        pq.product_quantity > 0 
       WHERE 
        p.product_subcategory_id = '$subcategory_id' 
       AND 
        ps.product_id IS NULL 
+0

판매되지 않은 제품의 목록이'sales_approved'가''1 ''이 아닌 판매를 고려해야합니까? 귀하의 질문에, 그것은 당신의 비즈니스 규칙에 판매가 완료되었는지에 대한 약간의 미묘함이있는 것 같습니다. 설명 해주십시오. –

+0

당신은'GROUP BY'에 비표준 MySQL 확장을 사용하고 있습니다. 확장 프로그램을 올바르게 사용하고있는 것처럼 보이지만 검색어를 변경하려면 잘못 사용하기 시작할 수 있습니다. 이 내용을 읽고 조심하십시오. http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html –

+0

모든 제품이 다른 테이블에서 판매되고 판매가 생성 될 때마다 판매 테이블에 기록을 남긴다. 일단 판매가 완료되면 나는 판매 된 제품이 판매 승인을 받았는지 확인하기 위해 더 이상 판매 테이블에 가입하지 않아도되는 방식으로 판매 된 판매 시간으로 판매 된 제품을 업데이트합니다. 보류중인 판매는 0으로 표시되고 1로 개선되고 2로 취소됩니다. 텍스트를 보내 주시면 매우 유용합니다. –

답변

1

일반적으로 집합 B에 포함되지 않은 집합 A의 멤버를 얻는 방법은 왼쪽 조인을 사용하는 것입니다. 먼저 쿼리를 단순화하여 시작하겠습니다.

SELECT p.product_id, ps.product_id from product p 
LEFT JOIN product_sold ps 
WHERE ps.product_id IS NULL 

이렇게하면 product_sold에 값이없는 모든 제품 레코드가 반환됩니다. 거기에서 세부 정보를 추가 할 수 있어야합니다.

+0

지금까지 도움이되어서 정말 고마워. 대답으로 내 질문을 업데이트합니다. 감사! –

0

이 시도 :이

SELECT 
    product.product_id 
FROM product 
    LEFT JOIN 
     (
      SELECT 
       product.product_id 
      FROM product 
      INNER JOIN product_sold 
       ON product.product_id = product_sold.product_id 
       AND product.product_subcategory_id = '$subcategory_id' 
      INNER JOIN sales 
       ON sales.sales_id = product_sold.product_sales_id 
      WHERE sales.sales_approved = '1' 
       AND sales.sales_approved_time > '$start_timestamp' 
       AND sales.sales_approved_time < '$end_timestamp' 
      GROUP BY product_sold.product_type, product.product_id 
     ) AS psold 
      ON product.product_id = psold.product_id 
WHERE psold.product_id IS NULL 

을, 당신은 판매 제품과 subrequest이 있고 모든 제품을 조인 절에있는 경우에만 제품을 선택 WHERE 첫 번째 테이블 (모든 제품)이 아니라 두 번째 (판매 된 제품).

+0

중첩 된 SELECT 쿼리를 수행하지 않아도되며 성능상의 이유로 쿼리를 사용하지 않는 것이 좋습니다. – BobRodes

+0

@BobRodes 나는 여기에 동의하지만, 여기에 몇 가지 테이블의 정확한 구조와 제품 판매 여부를 정확히 알지 못하므로 초기 요청을 다시 사용합니다. –

+0

추론을 질문하는 것을 의미하지는 않았지만 OP가 아직 왼쪽 조인을 이해하지 못하면 중첩 된 선택을 사용하여 문제를 해결해야한다는 아이디어를 얻었을 수 있습니다. 시간. 그래서 나는 그것을 지적하는 것이 좋은 생각이라고 생각했습니다. :) – BobRodes

관련 문제