2012-04-25 65 views
0

我有这个疑问:获取最后一排的MYSQL

SELECT 
    s.last_spread, s.sd, s.mean, s.id 
    ,c.id_ticker, c.coef 
    ,t.ticker 
    ,/*p.last,*/ p.price 

FROM (SELECT * FROM spreads WHERE spreads.id_check=1 LIMIT 60,896) as s 

    INNER JOIN coef as c 
     ON c.id_spread = s.id 

    INNER JOIN tickers AS t 
      ON t.id = c.id_ticker 

    LEFT JOIN (SELECT prices.id_ticker, MAX(prices.date) as last, prices.price FROM prices GROUP BY prices.id_ticker) AS p 
      ON p.id_ticker = t.id 

ORDER BY s.id, c.id 

最后JOIN不会返回正确的值....我需要得到行情的最新价格(所以最后一行每个股票代码)。

目前它返回第一个价格,我如何更改整个查询以获取每个ticker.id的最后价格? (p.id_ticker = t.id

谢谢!

回答

3

通过添加一个以该子查询:

SELECT prices.id_ticker, MAX(prices.date) as last, prices.price 
FROM prices GROUP BY prices.id_ticker 
order by prices.id_ticker desc 
+0

它工作正常! – Dail 2012-04-25 10:16:13

+0

@jurgend是否可以优化它? (我指的是索引或其他?) – Dail 2012-04-25 10:16:41

2

使用having子句将优雅:

LEFT JOIN (SELECT prices.id_ticker, prices.date as last, prices.price FROM prices GROUP BY prices.id_ticker HAVING prices.date = MAX(prices.date)) 

编辑:但它确实工作......(见评论如下)

+1

我喜欢这个优雅。 – newenglander 2012-04-25 08:58:14

+0

@Argeman是的,它是优雅的......但我试过了,它不起作用,p.last和p.price返回NULL,我该如何解决它? – Dail 2012-04-25 10:12:52

+0

@Dail你是对的,它不起作用。它只能用于整个日期最大的id_ticker!抱歉... – Argeman 2012-04-25 10:24:08

1

我会说使用ORDER BYLIMIT只得到一个价格(最后一个价格)。