繁体   English   中英

使用哪种类型的JOIN? MySQL的

[英]What type of JOIN to use? 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

通常,获取不包含在集合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中没有值的所有产品记录。 您应该可以从那里添加细节。

尝试这个 :

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

这样,您有一个出售产品的子请求,并且将其与所有产品结合在一起,WHERE子句仅选择第一个表中的产品(所有产品),而不选择第二个表中的产品(已售产品)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM