多联接选择

时间:2019-04-02 18:58:33

标签: sql phpmyadmin

让我们以名称为“项目”和“列”的表格作为数据:项目,卖方,价格,日期。 现在我需要这样的选择器:对于任何项目,我们都需要在卖方建议的某个日期间隔中选择最小价格,如果有多个日期,则只给以后),如果该日期有多个卖方,请显示所有。 我写了一些代码,但它没有从给定列表中获取最少的日期。 我需要在选择器中添加什么才能获得所需的结果?

SELECT *    
FROM Items mt 
    INNER JOIN
    (
        SELECT Item, MIN(Price) MinPrice
        FROM Items    
        GROUP BY Item
    ) 
    t ON mt.Item = t.Item AND mt.Price = t.MinPrice
    where Date > '2019-04-01' and Date < '2019-04-15'
    sample: 
    ItemA SellerA 10 2019-04-02
    ItemA SellerB 10 2019-04-03
    ItemA SellerC 10 2019-04-07
    ItemA SellerD 20 2019-04-05
    ItemA SellerE 10 2019-04-06
    ItemA SellerF 10 2019-04-02
    ItemA SellerG 20 2019-04-07

    result:
    ItemA SellerC 10 2019-04-07
    ItemA SellerG 20 2019-04-07

2 个答案:

答案 0 :(得分:0)

我想你想要

SELECT it.*    
FROM Items it INNER JOIN
     (SELECT Item, MIN(Price) as MinPrice
      FROM Items  
      WHERE Date > '2019-04-01' AND Date < '2019-04-15'  
      GROUP BY Item
     ) itmin
     ON it.Item = itmin.Item AND it.Price = itmin.MinPrice
WHERE it.Date > '2019-04-01' AND it.Date < '2019-04-15' ;

答案 1 :(得分:0)

因此我们无法按日期加入,因为按日期分组可能无法为我们提供日期范围内的最低价格。因此,我们必须使用两个where子句。

因此,我们使用内部查询Z来获取所需日期范围内每件商品的最低价格和最高日期。然后回到您的基本组合中,以获取具有该最大日期的所有卖家。

未经测试:

SELECT I.Item, I.Seller, I.Price,I.Date
FROM ITEMS I
INNER JOIN (SELECT min(price) MinPrice, max(date) maxDate, item
            FROM items 
            WHERE Date > '2019-04-01' and < '2018-04-15'
            GROUP BY Item) Z
  ON I.Item = Z.Item
 AND I.Price =  Z.Price
 and I.Date = Z.MaxDate
WHERE I.Date > '2019-04-01' and < '2018-04-15'

但是我不认为这是正确的...因为最大日期可能不是与最小价格相关的日期...

所以...

SELECT I.Item, I.Seller, I.Price,I.Date
FROM ITEMS I
INNER JOIN (SELECT min(price) MinPrice, item
            FROM items 
            WHERE Date > '2019-04-01' and < '2018-04-15'
            GROUP BY Item) Z
  ON I.Item = Z.Item
 AND I.Price =  Z.Price
 INNER JOIN (SELECT max(Date) MaxDate, item, Price
            FROM items 
            WHERE Date > '2019-04-01' and < '2018-04-15'
            GROUP BY Item, Price) Y
  ON I.Item = Y.Item
 AND I.Price =  Y.Price
 AND I.Date = Y.MaxDate
WHERE I.Date > '2019-04-01' and < '2018-04-15'

但是后来我认为应该有一种方法可以简化此操作,因此我不必有3个where子句...