MIN() 子查询结果

时间:2021-07-23 08:54:14

标签: mysql sql

我对 SQL 很陌生,这可能是一个非常愚蠢且简单的问题,但我自己无法解决,所以这里是场景: 我有两张桌子,产品和产品变体有点像这样。

产品

idproducts | product | ... | checked
-------------------------------------
1          | testpr1 | ... | 0
2          | testpr2 | ... | 0
3          | testpr3 | ... | 1
...

产品变化

productid | colorvalue | price_single | price_palette | ...
------------------------------------------------------------
1         | 0          | 12.50        | 11.50         | ...
1         | 1          | 10.25        | 10.00         | ...
2         | 0          | 14.50        | 13.75         | ...
2         | 1          | 13.00        | 11.50         | ...
2         | 1          | 12.50        | 12.00         | ...
...

使用 2x LEFT JOIN,我尝试根据颜色值从 productvariations 表中获取相应的 price_single 和 price_palette 以及其他一些列。第一个颜色值 = '0' 的 LEFT JOIN 效果很好,因为每个产品只有一行颜色值 = '0'。但是第二个 LEFT JOIN 为相应产品的 colorvalue = '1' 的每一行返回一个新的结果行,因为可以有多个具有该颜色值的行。这是我到目前为止的代码:

SELECT products.*, productvar1.price_single, productvar1.price_palette, productvar2.price_single, productvar2.price_palette, productvar1.price_specialconditions, productvar1.price_colorchange,
FROM products 
LEFT JOIN productvariations AS productvar1 
ON products.idproducts = productvar1.product AND productvar1.colorvalue = '0' 
LEFT JOIN productvariations AS productvar2 
ON products.idproducts = productvar2.product AND productvar2.colorvalue = '1' 
WHERE products.checked = '0' LIMIT 200;

从这样的问题 (LEFT JOIN only first row) 我明白我必须在子查询中使用 MIN() 。但是由于我对 SQL 还很陌生,所以我真的不明白如何准确地应用它。这是我尝试过的,我知道它根本没有意义,但这是我昨天为理解并使其发挥作用而绝望的尝试之一:

SELECT products.*, productvar1.price_single, productvar1.price_palette, productvar2.price_single, productvar2.price_palette, productvar1.price_specialconditions, productvar1.price_colorchange, 
FROM products 
LEFT JOIN productvariations AS productvar1 
ON products.idproducts = productvar1.product AND productvar1.colorvalue = '0' 
LEFT JOIN 
    (SELECT product, MIN(price_single), MIN(price_palette) 
    FROM productvariations AS productvar2
    WHERE productvar2.products = producst.idproducts AND productvar2.colorvalue = '1'
    GROUP BY product) AS productvar2
ON products.idproducts = productvar2.product AND productvar2.colorvalue = '1' 
WHERE products.checked = '0' LIMIT 200;

shubham 的工作解决方案

SELECT products.*, productvar1.price_single, productvar1.price_palette, productvar2.price_single, productvar2.price_palette 
FROM products 
LEFT JOIN productvariations AS productvar1 
ON products.idproducts = productvar1.productid AND productvar1.colorvalue = '0' 
LEFT JOIN 
    (SELECT productvar.productid, MIN(productvar.price_single)as price_single , MIN(productvar.price_palette) as price_palette,productvar.colorvalue 
    FROM productvariations AS productvar inner join products on productvar.productid = products.idproducts
    WHERE productvar.productid = products.idproducts AND productvar.colorvalue = '1'
    GROUP BY productvar.productid) AS productvar2
ON products.idproducts = productvar2.productid AND productvar2.colorvalue = '1' 
WHERE products.checked = '0' LIMIT 200;

1 个答案:

答案 0 :(得分:1)

SELECT products.*, productvar1.price_single, productvar1.price_palette, productvar2.price_single, productvar2.price_palette 
FROM products 
LEFT JOIN productvariations AS productvar1 
ON products.idproducts = productvar1.productid AND productvar1.colorvalue = '0' 
LEFT JOIN 
    (SELECT productvar.productid, MIN(productvar.price_single)as price_single , MIN(productvar.price_palette) as price_palette,productvar.colorvalue 
    FROM productvariations AS productvar inner join products on productvar.productid = products.idproducts
    WHERE productvar.productid = products.idproducts AND productvar.colorvalue = '1'
    GROUP BY productvar.productid) AS productvar2
ON products.idproducts = productvar2.productid AND productvar2.colorvalue = '1' 
WHERE products.checked = '0' LIMIT 200;

这是 SQL Fiddle 链接,我不确定您想要什么,但我认为这可能会有所帮助。

相关问题