【问题标题】:Can't seem to make the results of query to be unique似乎无法使查询结果唯一
【发布时间】:2020-09-10 23:18:00
【问题描述】:

我的问题是我只需要对每种饮料 (a.DRINK) 做一次/唯一的以下声明,但我似乎无法做到。

create table LOWEST as 
    select a.DRINK, min(b.PRICE), c.STREET, c.BLDG_NO
    from ALLDRINKS a
    left join SERVES b on a.DRINK = b.DRINK
    left join LOCATED c on b.PUB = c.PUB
    group by a.DRINK, c.STREET, c.BLDG_NO

我得到的当前结果

------------------------------------------------
| DRINK |min(b.PRICE)|     STREET    | BLDG_NO |
| VODKA |    7.10    | FAKE ST.      |   123   |
| VODKA |    4.50    | OAK Ave.      |    13   | 
| VODKA |    8.30    | Rail RD.      |    11   | 
| RUM   |    6.30    | Cherry RD.    |   131   | 
| RUM   |   10.30    | TEST Pl.      |    21   |  
------------------------------------------------

我期待的地方:

------------------------------------------------
| DRINK |min(b.PRICE)|     STREET    | BLDG_NO |
| VODKA |    4.50    | OAK Ave.      |    13   |  
| RUM   |    6.30    | Cherry RD.    |   131   |   
------------------------------------------------

如果您还可以解释需要做的事情背后的逻辑,那将在未来非常有帮助!先感谢您! -使用MYSQL Workbench 8.0

【问题讨论】:

  • 您能否在您的表格中添加一些行以及您当前获得的输出?找到答案会很有帮助:) 另请参阅:meta.stackoverflow.com/questions/333952/…
  • 现在修复我的错误
  • 你的MySql是什么版本的?
  • 如果您只想要饮料的最低价格(价格)然后从选择和分组依据。
  • 抱歉,我遇到了令人困惑的问题,并添加/更正了详细信息@Balastrong

标签: mysql sql join unique greatest-n-per-group


【解决方案1】:

您可以使用SERVES表格中的row_number()窗口函数来获取每个DRINK的最低价格,因此您不需要group by

create table LOWEST as 
    select a.DRINK, b.PRICE, c.STREET, c.BLDG_NO
    from ALLDRINKS a
    left join (
      select t.* 
      from (
        select *, row_number() over (partition by DRINK order by price) rn
        from SERVES      
      ) t
      where t.rn = 1
    ) b on a.DRINK = b.DRINK
    left join LOCATED c on b.PUB = c.PUB

【讨论】:

    【解决方案2】:

    您希望serves 中的行具有每个drink 的最低价格,以及相应的location。如果是这样,您不应该考虑聚合,而是过滤

    您可以在left join 中使用相关子查询进行过滤:

    create table lowest as 
    select d.drink, s.price, c.street, l.bldg_no
    from alldrinks d
    left join serves s
        on  s.drink = d.drink
        and s.price = (select min(s1.price) from serves s1 where s1.drink = s.drink)
    left join located l 
        on  l.pub = s.pub
    

    请注意,我重命名了您的表别名,以便它们更有意义,这使得查询更容易理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多