MySQL如何获得所需的结果

时间:2014-07-23 09:30:18

标签: mysql

我有以下表格。

表产品(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

2 个答案:

答案 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编入索引。