MySQL:使用最小值获取整行

MySQL:使用最小值获取整行,mysql,sql,Mysql,Sql,我试图以最低的价格获得完整的行,而不仅仅是最低价格的字段 创建表: CREATE TABLE `Products` ( `SubProduct` varchar(100), `Product` varchar(100), `Feature1` varchar(100), `Feature2` varchar(100), `Feature3` varchar(100), `Price1` float, `Price2` float, `Price3` float,

我试图以最低的价格获得完整的行,而不仅仅是最低价格的字段

创建表:

CREATE TABLE `Products` (
  `SubProduct` varchar(100),
  `Product` varchar(100),
  `Feature1` varchar(100),
  `Feature2` varchar(100),
  `Feature3` varchar(100),
  `Price1` float,
  `Price2` float,
  `Price3` float,
  `Supplier` varchar(100)
);
插入:

INSERT INTO
  `Products` (`SubProduct`, `Product`, `Feature1`, `Feature2`, `Feature3`, `Price1`, `Price2`, `Price3`, `Supplier`)
VALUES
  ('Awesome', 'Product', 'foo', 'foo', 'foor', '1.50', '1.50', '0', 'supplier1'),
  ('Awesome', 'Product', 'bar', 'foo', 'bar', '1.25', '1.75', '0', 'supplier2');
选择:

SELECT
  `SubProduct`,
  `Product`,
  `Feature1`,
  `Feature2`,
  `Feature3`,
  MIN(`Price1`),
  `Price2`,
  `Price3`,
  `Supplier`
FROM `Products`
  GROUP BY `SubProduct`, `Product`
  ORDER BY `SubProduct`, `Product`;
你可以在

我从第二个插入行中获取第一个插入行,其中包含price1列的内容

我希望得到包含正确功能、供应商和其他列的完整行。在本例中,它应该是完整的第二个插入行,因为它在price1列中的价格最低。

尝试以下方法:

SELECT
  `p`.`SubProduct`,
  `p`.`Product`,
  `p`.`Feature1`,
  `p`.`Feature2`,
  `p`.`Feature3`,
 `p`.`Price1`,
  `p`.`Price2`,
  `p`.`Price3`,
  `p`.`Supplier`
FROM `Products` `p`
inner join (select MIN(`Price1`)as `Price1`
            From `Products`
           ) `a` on `a`.`Price1` = `p`.`Price1`

ORDER BY `p`.`SubProduct`, `p`.`Product`;
演示:

试试这个:

SELECT
  `p`.`SubProduct`,
  `p`.`Product`,
  `p`.`Feature1`,
  `p`.`Feature2`,
  `p`.`Feature3`,
 `p`.`Price1`,
  `p`.`Price2`,
  `p`.`Price3`,
  `p`.`Supplier`
FROM `Products` `p`
inner join (select MIN(`Price1`)as `Price1`
            From `Products`
           ) `a` on `a`.`Price1` = `p`.`Price1`

ORDER BY `p`.`SubProduct`, `p`.`Product`;
演示:

试试这个:

SELECT
  `p`.`SubProduct`,
  `p`.`Product`,
  `p`.`Feature1`,
  `p`.`Feature2`,
  `p`.`Feature3`,
 `p`.`Price1`,
  `p`.`Price2`,
  `p`.`Price3`,
  `p`.`Supplier`
FROM `Products` `p`
inner join (select MIN(`Price1`)as `Price1`
            From `Products`
           ) `a` on `a`.`Price1` = `p`.`Price1`

ORDER BY `p`.`SubProduct`, `p`.`Product`;
演示:

试试这个:

SELECT
  `p`.`SubProduct`,
  `p`.`Product`,
  `p`.`Feature1`,
  `p`.`Feature2`,
  `p`.`Feature3`,
 `p`.`Price1`,
  `p`.`Price2`,
  `p`.`Price3`,
  `p`.`Supplier`
FROM `Products` `p`
inner join (select MIN(`Price1`)as `Price1`
            From `Products`
           ) `a` on `a`.`Price1` = `p`.`Price1`

ORDER BY `p`.`SubProduct`, `p`.`Product`;

演示:

您需要获取最小价格行,然后将这些行与主表连接,如下所示:

SELECT
  P.`SubProduct`,
  P.`Product`,
  P.`Feature1`,
  P.`Feature2`,
  P.`Feature3`,
  `Price` AS Price1,
  P.`Price2`,
  P.`Price3`,
  P.`Supplier`
FROM `Products` AS P JOIN (
    SELECT `SubProduct`, `Product`, MIN(`Price1`) AS Price
    FROM `Products`
    GROUP BY `SubProduct`, `Product`
  ) AS `MinPriceRows`
ON P.`SubProduct` = MinPriceRows.`SubProduct`
AND P.`Product` = MinPriceRows.`Product`
AND P.Price1 = MinPriceRows.Price
ORDER BY P.`SubProduct`, P.`Product`;
工作演示:


这里我所做的是获得一个临时记录集,名为
MinPriceRows
表,它将为您提供每个子产品和产品的最低价格。然后,我将这些行与主表连接,以便主表行可以减少为仅包含每个子产品和产品的最低价格的行。

您需要获取最低价格行,然后将这些行与主表连接,如下所示:

SELECT
  P.`SubProduct`,
  P.`Product`,
  P.`Feature1`,
  P.`Feature2`,
  P.`Feature3`,
  `Price` AS Price1,
  P.`Price2`,
  P.`Price3`,
  P.`Supplier`
FROM `Products` AS P JOIN (
    SELECT `SubProduct`, `Product`, MIN(`Price1`) AS Price
    FROM `Products`
    GROUP BY `SubProduct`, `Product`
  ) AS `MinPriceRows`
ON P.`SubProduct` = MinPriceRows.`SubProduct`
AND P.`Product` = MinPriceRows.`Product`
AND P.Price1 = MinPriceRows.Price
ORDER BY P.`SubProduct`, P.`Product`;
工作演示:


这里我所做的是获得一个临时记录集,名为
MinPriceRows
表,它将为您提供每个子产品和产品的最低价格。然后,我将这些行与主表连接,以便主表行可以减少为仅包含每个子产品和产品的最低价格的行。

您需要获取最低价格行,然后将这些行与主表连接,如下所示:

SELECT
  P.`SubProduct`,
  P.`Product`,
  P.`Feature1`,
  P.`Feature2`,
  P.`Feature3`,
  `Price` AS Price1,
  P.`Price2`,
  P.`Price3`,
  P.`Supplier`
FROM `Products` AS P JOIN (
    SELECT `SubProduct`, `Product`, MIN(`Price1`) AS Price
    FROM `Products`
    GROUP BY `SubProduct`, `Product`
  ) AS `MinPriceRows`
ON P.`SubProduct` = MinPriceRows.`SubProduct`
AND P.`Product` = MinPriceRows.`Product`
AND P.Price1 = MinPriceRows.Price
ORDER BY P.`SubProduct`, P.`Product`;
工作演示:


这里我所做的是获得一个临时记录集,名为
MinPriceRows
表,它将为您提供每个子产品和产品的最低价格。然后,我将这些行与主表连接,以便主表行可以减少为仅包含每个子产品和产品的最低价格的行。

您需要获取最低价格行,然后将这些行与主表连接,如下所示:

SELECT
  P.`SubProduct`,
  P.`Product`,
  P.`Feature1`,
  P.`Feature2`,
  P.`Feature3`,
  `Price` AS Price1,
  P.`Price2`,
  P.`Price3`,
  P.`Supplier`
FROM `Products` AS P JOIN (
    SELECT `SubProduct`, `Product`, MIN(`Price1`) AS Price
    FROM `Products`
    GROUP BY `SubProduct`, `Product`
  ) AS `MinPriceRows`
ON P.`SubProduct` = MinPriceRows.`SubProduct`
AND P.`Product` = MinPriceRows.`Product`
AND P.Price1 = MinPriceRows.Price
ORDER BY P.`SubProduct`, P.`Product`;
工作演示:

这里我所做的是获得一个临时记录集,名为
MinPriceRows
表,它将为您提供每个子产品和产品的最低价格。然后,我将这些行与主表连接起来,以便主表行可以减少到只包含每个子产品和产品的最低价格的行。

这是有效的

SELECT
P1.`SubProduct`,
P1.`Product`,
P1.`Feature1`,
P1.`Feature2`,
P1.`Feature3`,
P1.`Price1`,
P1.`Price2`,
P1.`Price3`,
P1.`Supplier`
FROM `Products` P1
INNER JOIN `Products` P2 ON  P1.SubProduct = P2.SubProduct AND P1.Product = P2.Product
WHERE P1.Price1 < P2.Price1
选择
P1.`子管道',
P1.`产品',
P1.‘特征1’,
P1.‘特征2’,
P1.‘特征3’,
P1.‘价格1’,
P1.‘价格2’,
P1.‘价格3’,
P1.`供应商`
来自“产品”P1
P1.SubProduct=P2.SubProduct和P1.Product=P2.Product上的内部联接`Products`P2
其中P1.Price1
这很有效

SELECT
P1.`SubProduct`,
P1.`Product`,
P1.`Feature1`,
P1.`Feature2`,
P1.`Feature3`,
P1.`Price1`,
P1.`Price2`,
P1.`Price3`,
P1.`Supplier`
FROM `Products` P1
INNER JOIN `Products` P2 ON  P1.SubProduct = P2.SubProduct AND P1.Product = P2.Product
WHERE P1.Price1 < P2.Price1
选择
P1.`子管道',
P1.`产品',
P1.‘特征1’,
P1.‘特征2’,
P1.‘特征3’,
P1.‘价格1’,
P1.‘价格2’,
P1.‘价格3’,
P1.`供应商`
来自“产品”P1
P1.SubProduct=P2.SubProduct和P1.Product=P2.Product上的内部联接`Products`P2
其中P1.Price1
这很有效

SELECT
P1.`SubProduct`,
P1.`Product`,
P1.`Feature1`,
P1.`Feature2`,
P1.`Feature3`,
P1.`Price1`,
P1.`Price2`,
P1.`Price3`,
P1.`Supplier`
FROM `Products` P1
INNER JOIN `Products` P2 ON  P1.SubProduct = P2.SubProduct AND P1.Product = P2.Product
WHERE P1.Price1 < P2.Price1
选择
P1.`子管道',
P1.`产品',
P1.‘特征1’,
P1.‘特征2’,
P1.‘特征3’,
P1.‘价格1’,
P1.‘价格2’,
P1.‘价格3’,
P1.`供应商`
来自“产品”P1
P1.SubProduct=P2.SubProduct和P1.Product=P2.Product上的内部联接`Products`P2
其中P1.Price1
这很有效

SELECT
P1.`SubProduct`,
P1.`Product`,
P1.`Feature1`,
P1.`Feature2`,
P1.`Feature3`,
P1.`Price1`,
P1.`Price2`,
P1.`Price3`,
P1.`Supplier`
FROM `Products` P1
INNER JOIN `Products` P2 ON  P1.SubProduct = P2.SubProduct AND P1.Product = P2.Product
WHERE P1.Price1 < P2.Price1
选择
P1.`子管道',
P1.`产品',
P1.‘特征1’,
P1.‘特征2’,
P1.‘特征3’,
P1.‘价格1’,
P1.‘价格2’,
P1.‘价格3’,
P1.`供应商`
来自“产品”P1
P1.SubProduct=P2.SubProduct和P1.Product=P2.Product上的内部联接`Products`P2
其中P1.Price1
您的
分组依据
用法无效。但是MySQL没有拒绝它,而是选择简单地返回“不确定”的结果(实际上是“随机的”)。有关更多详细信息,请参阅:如果子产品和产品有两个具有相同最低价格的项目怎么办?那么选择哪列并不重要。您的
分组依据
用法无效。但是MySQL没有拒绝它,而是选择简单地返回“不确定”的结果(实际上是“随机的”)。有关更多详细信息,请参阅:如果子产品和产品有两个具有相同最低价格的项目怎么办?那么选择哪列并不重要。您的
分组依据
用法无效。但是MySQL没有拒绝它,而是选择简单地返回“不确定”的结果(实际上是“随机的”)。有关更多详细信息,请参阅:如果子产品和产品有两个具有相同最低价格的项目怎么办?那么选择哪列并不重要。您的
分组依据
用法无效。但是MySQL没有拒绝它,而是选择简单地返回“不确定”的结果(实际上是“随机的”)。有关更多详细信息,请参阅:如果子产品和产品有两个具有相同最低价格的项目呢?那么选择哪一列并不重要。谢谢!如果子管道可能为空怎么办?在您的解决方案中,这些行将被忽略。参见@Hativ3,在这种情况下,输出应该是什么?这意味着您希望在输出中得到什么。子产品和产品可以视为一个单元。如果SubProduct为NULL,则它只是一个没有SubProduct的产品,您可以将其视为一个新的(或另一个)独立产品。然后子管道可以仅输出NULL。你明白吗?我已经扩展了我的示例:我希望它还应该显示一个带有NULL和Product的行。在连接子句中使用NULL安全比较
,如下所示:
P.SubProduct MinPriceRows.SubProduct
。更新小提琴:谢谢!如果子管道可能为空怎么办?在您的解决方案中,这些行将被忽略。参见@Hativ3,在这种情况下,输出应该是什么?这意味着您希望在输出中得到什么。子产品和产品可以视为一个单元。如果SubProduct为NULL,则它只是一个没有SubProduct的产品,您可以将其视为一个新的(或另一个)独立产品。然后子管道可以仅输出NULL。你明白了吗?我有一个