是否可以执行从不同列中选择两个最大/最小值的单个SQL查询?

是否可以执行从不同列中选择两个最大/最小值的单个SQL查询?,sql,sqlite,group-by,Sql,Sqlite,Group By,我正在开始使用SQLite。我已经完成了两个教程,它们为我提供了SQL语句的全局视图。我想我可以通过几个简单的查询来完成我的任务。然而,出于学术上的原因,我想将它们组合成一个更复杂的查询 让我们看看我的问题,假设我有这个表: +---------+-------+--------+-------------+ | Product | Kcal | Price | Supermarket | +---------+-------+--------+-------------+ milk

我正在开始使用SQLite。我已经完成了两个教程,它们为我提供了
SQL
语句的全局视图。我想我可以通过几个简单的查询来完成我的任务。然而,出于学术上的原因,我想将它们组合成一个更复杂的查询

让我们看看我的问题,假设我有这个表:

+---------+-------+--------+-------------+
| Product |  Kcal | Price  | Supermarket |
+---------+-------+--------+-------------+
   milk      300     1.01     Carrefour
   eggs      75      1.50     Carrefour
   bread     400     1.99     Carrefour
   milk      150     1.20     Lidl
   eggs      50      2.00     Lidl
   bread     300     1.50     Lidl
假设我想要这个输出:

+-------------+----------+---------+-----------+---------+
| Supermarket | Max Kcal | Product | Min Price | Product | 
+-------------+----------+---------+-----------+---------+
   Carrefour      400       bread      1.01        milk
   Lidl           300       bread      1.20        milk                  
检索与最大/最小值关联的键的简单查询是:

sql = ('SELECT PRODUCT, Supermarket '
   'from PRODUCTS '
   'where KCAL = (SELECT MAX(KCAL) from PRODUCTS) ')
我尝试使用
groupby
语句来检索按“supermarket”分组的所有max“kcal”

以及按“超市”分组的所有最低“价格”

但是,我没有找到任何关于如何将这两个查询组合在一个查询中的线索,目的是一次性访问数据库并减少所花费的时间

有可能吗?还是我不得不问几个问题

我可能过度简化了我的问题,但我有一个500MB的数据库,其中有很多表,每次我都需要一个按公共键排序的最大/最小值(“超级市场”)。我需要很多每次需要几分钟的查询

我想知道如果Kcals和price在不同的表中是否会有区别,我还没有尝试组合来自不同表的查询(我从简单到复杂)


谢谢大家!

您需要两个查询,但要获得组的最大值和最小值,您需要小心。所以我建议你检查一下这个问题的答案:你还需要解决在关系出现的情况下会发生什么

现在关于你的问题,如果你有两个基于超市的查询,你只需要加入它们

 SELECT Q1.Supermarket, Q1.`Max Kcal`, Q1.`Product`,
        Q2.`Min Price`, Q2.`Product`
 FROM ( Query1 ..) as Q1
 JOIN ( Query2 ..) as Q2
   ON Q1.Supermarket = Q2.Supermarket

试试看,不知道你想达到什么样的效果,但据我所知,每个商店的同一个产品都有不同的cal和价格,所以你试图得到最便宜的cal和最便宜的价格

    Select minprice.Supermarket, MaxCal.Kcal, MaxCal.Product, MinPrice.Price,MinPrice.Product
    From (
    Select supermarket, Min(price) Price, Product from #products
    Group by Supermarket, Product 
    ) MinPrice 
    Left Join (
    Select Supermarket, Max(kcal) as Kcal, Product from #products
    Group by Supermarket, Product ) MaxCal on MinPrice.Supermarket = MaxCal.Supermarket 
and MaxCal.Product= MinPrice.Product

这个想法是创建两个表

第一张表(如表A)包含超市、最大千卡、产品

包含超市、最低价格、产品的第二张表(如表B)

然后您可以将两个表合并到一个表中。这可以在一个查询中完成。看到我的答案了吗

查询如下所示:

SELECT A.supermarket, 
       A.max_kcal, 
       C.NAME, 
       B.min_price, 
       D.NAME 
FROM   (SELECT supermarket, 
               Max(kcal) AS max_kcal 
        FROM   product 
        GROUP  BY supermarket) AS A 
       JOIN (SELECT supermarket, 
                    Min(price) AS min_price 
             FROM   product 
             GROUP  BY supermarket) AS B 
         ON A.supermarket = B.supermarket 
       JOIN product C 
         ON C.kcal = A.max_kcal 
            AND C.supermarket = A.supermarket 
       JOIN product D 
         ON D.price = B.min_price 
            AND D.supermarket = B.supermarket
ORDER BY A.supermarket; 
我使用附加的表C和D来获得产品名称。
希望这有帮助

您是否尝试将
超市
列上的两个结果集,即“最大kcal”集和“最小价格”集合并?假设给定超市的
max(kcal)
为500,但有8种不同的产品有500 kcal。您希望输出的内容是什么?谢谢,它帮助了您很多。您只需要在最后添加一个
orderby
。请小心,如果你使用相同的max_KCal多元素,这也会有问题。谢谢你,我会仔细研究你的两个技巧(max/min问题和联系)。您的代码部分工作,我还不明白为什么,但在更大的场景中,与最大/最小值相关的产品没有正确恢复。我不知道这是否与你正在谈论的问题有关@Ebed Kharistian针对解决此问题的产品的附加
JOIN
语句。
    Select minprice.Supermarket, MaxCal.Kcal, MaxCal.Product, MinPrice.Price,MinPrice.Product
    From (
    Select supermarket, Min(price) Price, Product from #products
    Group by Supermarket, Product 
    ) MinPrice 
    Left Join (
    Select Supermarket, Max(kcal) as Kcal, Product from #products
    Group by Supermarket, Product ) MaxCal on MinPrice.Supermarket = MaxCal.Supermarket 
and MaxCal.Product= MinPrice.Product
SELECT A.supermarket, 
       A.max_kcal, 
       C.NAME, 
       B.min_price, 
       D.NAME 
FROM   (SELECT supermarket, 
               Max(kcal) AS max_kcal 
        FROM   product 
        GROUP  BY supermarket) AS A 
       JOIN (SELECT supermarket, 
                    Min(price) AS min_price 
             FROM   product 
             GROUP  BY supermarket) AS B 
         ON A.supermarket = B.supermarket 
       JOIN product C 
         ON C.kcal = A.max_kcal 
            AND C.supermarket = A.supermarket 
       JOIN product D 
         ON D.price = B.min_price 
            AND D.supermarket = B.supermarket
ORDER BY A.supermarket;