要使用哪种类型的联接?mysql

要使用哪种类型的联接?mysql,mysql,join,Mysql,Join,我有一个查询,其中选择了所有销售的产品。我想做的是反向查询,并获得所有产品在一段时间内没有售出 SELECT product.product_id, product.product_brand_id, product.product_model_id, product.product_subcategory_id, product.product_retail_price, product.product_wholesale_pric

我有一个查询,其中选择了所有销售的产品。我想做的是反向查询,并获得所有产品在一段时间内没有售出

 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 
    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 
    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子句只选择第一个表中的产品所有产品,而不选择第二个已售出的产品。

通常,获取集合a中未包含在集合B中的成员的方法是使用左联接。首先,我将简化您的查询:

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

这将返回所有在产品销售中没有价值的产品记录。您应该可以从那里添加详细信息。

您可能不需要执行嵌套的SELECT查询,如果您不这样做,出于性能原因,最好避免使用它。@BobRodes我同意您的看法,但在这里我不知道我们拥有的几个表的确切结构,以及如何确切地知道产品是否已售出,所以我重复了他的最初请求。我不是想质疑你的推理,但是如果OP还不理解左连接,他可能会认为需要使用嵌套选择来解决他的问题,然后一直使用该技术。所以我想指出这一点可能是个好主意您的未销售产品清单是否需要考虑销售批准不是“1”的销售额?从您的问题来看,您的业务规则中似乎有一些关于销售是否完成的微妙之处。请解释。您正在使用一个非标准的MySQL扩展来分组。您似乎正确地使用了扩展名,但如果要更改查询,可能会开始误用它。阅读本文,请注意:我将所有产品销售在不同的表中,每次创建销售时,都会在销售表中获得记录。一旦销售完成,我会在经过批准的时间内更新销售的产品,这样我就不必再加入销售表来查看产品是否已通过销售批准。待处理的销售被标记为0,A被批准为1,被取消为2。谢谢你的文字,这将是非常有用的。到目前为止还不错,谢谢你的帮助。我用答案更新我的问题。谢谢