【问题标题】:select minimum of one column maximum of another column选择一列的最小值 另一列的最大值
【发布时间】:2018-08-25 16:51:45
【问题描述】:

我的数据如下:

PID SID CID Price
1   1   1   18
2   1   1   19
3   1   2   10
4   2   2   22
5   2   2   21.35
6   3   2   25
7   3   7   30
8   3   2   40

我想为每个 SID 选择 CID 最小且价格最大的行。

预期输出:

PID SID CID Price
2   1   1   19
4   2   2   22
8   3   2   40

我的查询给出了预期的输出。但由于我是 MySQL 新手,我不确定这是否是最佳方式。

查询:

select a.PID, a.SID, a.CID, a.Price
from Products a
inner join (select SID as SID, min(CID) as CID_Min, max(Price) as Price_Max
            from Products
            group by SID) b
on a.SID=b.SID and
   a.CID=b.CID_Min and
   a.Price=b.Price_Max;

编辑#1: 抱歉,我观察到以下数据集,查询没有返回任何输出:

PID SID CID Price
11  6   1   18
12  6   1   19
13  6   2   30

但是预期的输出是:

PID SID CID Price
11  6   1   19

由于 SID=6 的最小 CID 为 1。根据 SID=6 和 CID=1 的值,Price 的最大值为 19。

知道如何实现它。

此查询是否最佳:

select t.SID, t.CID, t.Price
from Products t
inner join
  (select p.SID as SID_max, p.CID as CID_max, max(p.Price) as Price_max
   from Products p
   inner join 
     (select SID as SID_min, min(CID) as CID_min
      from Products
      group by SID) p_min
   on p.SID=p_min.SID_min and
      p.CID=p_min.CID_min
   group by p.SID, p.CID
  ) p_max
on t.SID=p_max.SID_max and
   t.CID=p_max.CID_max and
   t.Price=p_max.Price_max

【问题讨论】:

  • “我的查询给出了预期的输出。但由于我是 MySQL 新手,我不确定这是否是最佳的方法。”这确实是一种方法。
  • 问题是什么?
  • 您的查询很好!
  • 问题导致代码审查认为问题在这里更好codereview.stackexchange.com
  • 如果你问我是否不需要JOIN,请参阅fiddle

标签: mysql sql max min


【解决方案1】:

你当然想要 12、6、1、19 !?!?!?!?!?!?!

SELECT a.* 
  FROM my_table a 
  JOIN 
     ( SELECT x.sid
            , x.cid
            , MAX(price) price 
         FROM my_table x 
         JOIN 
            ( SELECT sid
                   , MIN(cid) cid 
                FROM my_table 
               GROUP 
                  BY sid
            ) y 
           ON y.sid = x.sid 
          AND y.cid = x.cid 
        GROUP 
           BY sid
            , cid
     ) b 
    ON b.sid = a.sid 
   AND b.cid = a.cid 
   AND b.price = a.price;
+-----+-----+-----+-------+
| pid | sid | cid | price |
+-----+-----+-----+-------+
|  12 |   6 |   1 |    19 |
+-----+-----+-----+-------+

【讨论】:

  • 谢谢,即使我写了同样的查询。我希望这是最佳查询。
  • 天哪,我希望如此。有一种“hack”方式可以使用更少的输入来编写相同的内容,但这是教科书的方法,而且速度非常快。另一种选择是使用变量。
【解决方案2】:

我认为只有一个 子查询 就足以为每个 SID 找到最小的 CID 并使用 子查询 执行 JOINs找到最大的Price

SELECT p.* FROM Products p
INNER JOIN (
   SELECT sid, min(cid) cid from Products
   GROUP BY sid
) pr ON pr.sid = p.sid AND
p.price = (SELECT MAX(price) FROM Products WHERE sid = pr.sid AND cid = pr.cid)

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 2014-10-05
    • 2020-05-20
    • 1970-01-01
    • 2012-05-29
    • 2023-03-23
    • 2021-07-25
    • 2020-03-02
    相关资源
    最近更新 更多