【问题标题】:getting max data in multiple join在多个连接中获取最大数据
【发布时间】:2020-07-14 16:33:59
【问题描述】:

我有这样的数据

purchase_order (po)

po_id   pi_id    store
112     789      ABC
113     101      DEF
114     102      GHI
115     103      JKL

purchase_items (pi)

pi_id  barcode   price    date
789    123       500      2020-06-04
101    123       400      2020-06-03
102    456       500      2020-06-02
103    456       400      2020-06-01

产品

barcode   product
123       milk
456       tea

如果商店不包括“GHI”,我想获取每个条形码的最新价格

预期结果

barcode  price
123      500
456      400

我该怎么办?

【问题讨论】:

    标签: mysql sql join subquery max


    【解决方案1】:

    一个选项使用相关子查询:

    select
        p.barcode,
        (
            select pi.price
            from purchase_items pi
            inner join purchase_orders po on po.pi_id = pi.pi_id
            where pi.barcode = p.barcode and po.store <> 'GHI'
            order by pi.date desc limit 1
        ) price
    from product p
    

    【讨论】:

      【解决方案2】:

      row_number() 是一种方法:

      select pi.barcode, pi.price
      from (select pi.*, row_number() over (partition by pi.barcode order by pi.date desc) as seqnum
            from purchase_items pi
            where not exists (select 1
                              from purchase_orders po 
                              where po.pi_id = pi.pi_id and po.store = 'GHI'
                             )
           ) pi
      where seqnum = 1;
      

      【讨论】:

        【解决方案3】:

        将连接与 max-function 一起使用:

        select pi.barcode, max(pi.price)
        from purchase_items pi
          join purchase_order po on po.pi_id=pi.pi_id
        where po.store!='GHI'
        group by pi.barcode
        

        【讨论】:

          【解决方案4】:

          一种使用子查询的方式。

          SELECT 
              DISTINCT
              a.`barcode`,
              a.`price` 
          FROM
              purchase_items a 
          WHERE a.`date` = 
              (SELECT 
                  MAX(`date`) 
              FROM
                  purchase_items i 
              WHERE i.barcode = a.barcode 
                  AND 'GHI' != 
                  (SELECT 
                      store 
                  FROM
                      purchase_order 
                  WHERE pi_id = i.`pi_id` 
                  LIMIT 1)) ;
          

          【讨论】:

            猜你喜欢
            • 2014-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多