选择从加入MySQL表最新条目
-
20-09-2019 - |
题
我在我的数据库中库存量信息。 结果,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
)
有实现此两种常用方法:子查询或自连接
编辑,使用子查询的示例:
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);