2012-04-25 5 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 

последних РЕГИСТРИРУЙТЕСЬ не возвращают правильное значение .... Мне нужно, чтобы получить последнюю цену линеечки (так последнюю строку каждого тикера).

На данный момент он возвращает первую цену, как я могу изменить весь запрос, чтобы получить последние цены каждого файла 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

+0

@ jurgend можно ли его оптимизировать? (я имею в виду индексы или другие?) – Dail

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)) 

Edit: Но это НЕ работы ... (см комментарии ниже)

+1

Мне нравится этот-элегантный. – newenglander

+0

@Argeman да это изящно ... но я попробовал, и он не работает, p.last и p.price возвращают NULL, как я могу это исправить? – Dail

+0

@Dail Вы правы, это не работает. Он может работать только для id_ticker с самой большой общей датой! Сожалею... – Argeman

1

Я бы сказал, используя ORDER BY и LIMIT, чтобы получить только одна цена (последняя цена).

Смежные вопросы