我在我的数据库中库存量信息。 结果,1表中,“股票”,用的数量和从它来的地方的文件名一起保持的productid(SKU)。

在其他表中,“stockfile”,包含了所有的文件名进行处理的日期沿着。

现在我需要让所有的产品与他们的最新的股票数量值。

这给了我的一切与他们所有的库存量(导致300.000记录)

产品多次
  

选择stock.stockid,stock.sku,stock.quantity,stockfile.filename,stockfile.date结果   现货结果   INNER JOIN stockfile ON stock.stockfileid = stockfile.stockfileid结果   ORDER BY stock.sku ASC

我已经尝试过这样的:

  

SELECT * FROM库存结果   INNER JOIN stockfile ON stock.stockfileid = stockfile.stockfileid结果   GROUP BY SKU结果   HAVING stockfile.date = MAX(stockfile.date),点击   ORDER BY stock.sku ASC

但它没有工作。

显示CREATE TABLE库存:

  

CREATE TABLE stock(点击    stockid BIGINT(20)NOT NULL AUTO_INCREMENT,点击    sku CHAR(25)NOT NULL,结果    quantity INT(5)NOT NULL,结果    creationdate日期时间NOT NULL,结果    stockfileid SMALLINT(5)无符号NOT NULL,结果    touchdate日期时间NOT NULL,结果    PRIMARY KEY(stockid)点击   )ENGINE = MyISAM的AUTO_INCREMENT = 315169默认字符集= latin1的

显示CREATE TABLE stockfile:

  

CREATE TABLE stockfile(点击    stockfileid SMALLINT(5)无符号NOT NULL AUTO_INCREMENT,点击    filename VARCHAR(25)NOT NULL,结果    creationdate日期时间DEFAULT NULL,结果    touchdate日期时间DEFAULT NULL,结果    date日期时间DEFAULT NULL,结果    begindate日期时间DEFAULT NULL,结果    enddate日期时间DEFAULT NULL,结果    PRIMARY KEY(stockfileid)点击   )ENGINE = MyISAM的AUTO_INCREMENT = 265默认字符集= latin1的

有帮助吗?

解决方案

这是常问“最大正每组的一个例子“的问题,我们每星期见StackOverflow上。按照该标签看其他类似的解决方案。

SELECT s.*, f1.*
FROM stock s
INNER JOIN stockfile f1
  ON (s.stockfileid = f1.stockfileid)
LEFT OUTER JOIN stockfile f2
  ON (s.stockfileid = f2.stockfileid AND f1.date < f2.date)
WHERE f2.stockfileid IS NULL;

如果有在stockfile多行具有最大的日期,你会得到他们两人在结果集。为了解决这个问题,你不得不一些打破僵局的条件加入到对f2加入。


感谢添加CREATE TABLE信息。这是非常有帮助,当你问SQL的问题。

我从你在AUTO_INCREMENT 315K行和stock只有265行stockfile表选项见。你stockfile表是关系中的父,和stock表是孩子,与列stockfileid引用stockfile的主键。

所以,你原来的问题是误导。你想从stock,而不是从stockfile最新行的最新一行。

SELECT f.*, s1.*
FROM stockfile f
INNER JOIN stock s1
  ON (f.stockfileid = s1.stockfileid)
LEFT OUTER JOIN stock s2
  ON (f.stockfileid = s2.stockfileid AND (s1.touchdate < s2.touchdate
      OR s1.touchdate = s2.touchdate AND s1.stockid < s2.stockid))
WHERE s2.stockid IS NULL;

我假设你想要的“最新”是相对于touchdate,所以如果你想使用creationdate相反,你可以做编辑。

我添加了一个学期的加入,使其解决关系。我知道你说的日期是“几乎唯一”,但俗话说,“的百万分之一是下周二。”


好吧,我想我明白你现在要做什么。你想每sku最近的一排,但date通过比较它们是在引用表stockfile

SELECT s1.*, f1.*
FROM stock s1
JOIN stockfile f1 ON (s1.stockfileid = f1.stockfileid)
LEFT OUTER JOIN (stock s2 JOIN stockfile f2 ON (s2.stockfileid = f2.stockfileid))
  ON (s1.sku = s2.sku AND (f1.date < f2.date OR f1.date = f2.date AND f1.stockfileid < f2.stockfileid))
WHERE s2.sku IS NULL;

这确实stock的自连接到自身,寻找具有相同sku和更近的date一行。如果没有被发现,那么s1包含最新行其sku。和stock的每个实例都有加入其stockfile得到date


有关优化回复评论:这是我很难测试,因为我没有填充数据的匹配你的表,但我猜你应该有以下指标:

CREATE INDEX stock_sku ON stock(sku);
CREATE INDEX stock_stockfileid ON stock(stockfileid);
CREATE INDEX stockfile_date ON stockfile(date);

我建议使用EXPLAIN分析没有索引的查询,然后一次创建一个索引,并与EXPLAIN重新分析,看看哪一个给人最直接的好处。

其他提示

使用:

SELECT DISTINCT s.stockid, 
       s.sku, 
       s.quantity, 
       sf.filename, 
       sf.date
  FROM STOCK s
  JOIN STOCKFILE sf ON sf.stockfileid = s.stockfileid
  JOIN (SELECT t.stockfileid,
               MAX(t.date) 'max_date'
          FROM STOCKFILE t
      GROUP BY t.stockfileid) x ON x.stockfileid = sf.stockfileid
                               AND x.max_date = sf.date
select *
from   stock
where  stockfileid in (
           select top 1 stockfileid
           from   stockfile
           order by date desc
       )

有实现此两种常用方法:子查询或自连接

请参阅此选择的例子在MySQL站点的组间最大

编辑,使用子查询的示例:

SELECT stock.stockid, stock.sku, stock.quantity,
       stockfile.filename, stockfile.date
FROM stock
INNER JOIN stockfile ON stock.stockfileid = stockfile.stockfileid
WHERE stockfile.date = (SELECT MAX(date) FROM stockfile);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top