我有以下表格。
表产品(P)
id name
1 x
2 y
3 z
表格细节。 (d)
id rate productId
1 5 1
2 9 2
3 10 1
4 12 2
5 14 1
6 10 3
我无法编写查询以获得所需的结果。
所需的输出就是这个。
productId Name CurrentDetailId currentRate LastDetailId last Rate
1 x 5 14 3 10
2 y 4 12 2 9
3 z 6 10 Null Null
我写这个查询
SELECT p.Id, p.Name, MAX(d.Id) AS CurrentDetailId , MAX(d2.id) AS LastDetailId, d.Rate , d2.Rate
FROM Product p
INNER JOIN detail d ON d.productId = p.Id
INNER JOIN detail d2 ON d.Id > d2.Id AND d.productId= d2.productId
GROUP BY d.productId
但此查询与INNER JOIN
一起使用不会列出产品3。
我想要所有的产品。如果没有最后一个Rate,那么只需设置为空白或null。
此处当前费率将是针对productId
的最大明细ID,而最后费率将是针对detailId
的第二最高productId
。
答案 0 :(得分:2)
试试这个:
select p.Id,p.Name,
(SELECT Rate FROM detail WHERE productId=p.Id ORDER BY id DESC LIMIT 1,1) AS last_rate,
(SELECT Rate FROM detail WHERE productId=p.Id ORDER BY id DESC LIMIT 1) AS current_rate
from Product p
这是demo
答案 1 :(得分:1)
还有另一种可能性:
SELECT p.Id, p.Name, SUBSTRING_INDEX(r.Rates,',',1) AS currentRate,
SUBSTRING_INDEX(r.Rates,',',-1) AS lastRate
FROM Product p JOIN
(SELECT productId,
SUBSTRING_INDEX(GROUP_CONCAT(Rate order by Id DESC),',',2) as Rates
FROM detail GROUP BY productId) r
ON p.Id=r.productId;
SQL小提琴:http://sqlfiddle.com/#!2/ebf5f0/1
要执行此查询,请务必将Product.Id,detail.Id和detail.productId编入索引。