2015-10-14 2 views
1

У меня есть таблица tbl_usi в MySQL с записями, как показано ниже:дисплей MySQL несколько строк в одной строке

 

present_date usi_value deal_count  
---------------------------------------------------------- 
2015-10-13  b1    c1   
2015-10-12  b2    c2    
2015-10-11  b3    c3 

Я хочу написать запрос, который будет делать это с помощью present_date поля, чтобы выбрать текущую дату и дату перед этим и отображать их вместе:

 
present_date usi_value deal_count previous_date previous_usi_value previous_deal_count  
---------------------------------------------------------- 
2015-10-13  b1    c1   2015-10-12  b2     c2   
2015-10-12  b2    c2   2015-10-11  b3     c3   
2015-10-11  b3    c3   2015-10-10  b4     c4   

Как это достичь. Спасибо

+0

Аналогичный вопрос: https://stackoverflow.com/questions/11509407/add-multiple-rows-in-just-one-row-from-a-single-table – user5226582

ответ

0

Альтернатива, которая работает, когда есть пробелы в датах.

select 
    a.present_date, 
    a.usi_value, 
    a.deal_count, 
    b.present_date as previous_present_date, 
    b.usi_value as previous_usi_value, 
    b.deal_count as previous_deal_count 
from 
    tbl_usi as a 
    join tbl_usi as b 
where 
    b.present_date = (select max(present_date) from tbl_usi where present_date < a.present_date); 

Как и с предыдущим раствором та же таблица соединяется дважды, но на этот раз предыдущая строка найдена путем подзапроса.

+0

Это отлично работает @ Майкл. Я действительно пробовал это раньше, но получил запас в предложении WHERE. Спасибо за это _ (где present_date Gyne

1

Выделите все из своего стола, затем присоедините его к себе, убедившись, что 2 соединенным таблицам даны разные имена, чтобы вы могли их отличить (я использовал здесь «a» и «b» здесь). Соединение смещает даты на 1 день. Затем вы можете выбрать нужные поля из объединенной таблицы.

select 
    a.present_date, 
    a.usi_value, 
    a.deal_count, 
    b.present_date as previous_present_date, 
    b.usi_value as previous_usi_value, 
    b.deal_count as previous_deal_count 
from 
    tbl_usi as a 
    left join tbl_usi as b 
    on b.present_date = a.present_date - interval 1 day; 

Если вы не уже есть раньше, вы теперь хотите индекс для столбца present_date слишком BTW.

+0

Спасибо большое Майкл. Ваше решение получает все в одной строке, как ожидалось, но теперь я понял, что нулевые значения извлекаются везде, где предыдущая дата является выходным или праздничным днем, в котором данные не будут указаны в таблице на эту дату. Возможно ли для даты перехода или любого другого решения получить предыдущую дату, просто отключив current_date на 1 строку. Таким образом, не будет нулевых строк. Затем я могу заказать по адресу present_date. Да, у меня уже есть уникальный ключевой индекс для present_date. Спасибо в Advance – Gyne

+0

Спасибо еще раз @ Майкл, но я решил это сейчас. Я создал поле Auto increment ID, а затем использовал его в соединении, отключив параметр previous_date по значению 1. Вот запрос, который я использовал. _SELECT c.present_date PresentDate, c.usi current_usi, c.deals current_deals, c.volume current_volume, c.value current_value, c.capitalisation current_capitalisation, p.present_date previous_date, p.usi previous_usi, p.deals previous_deals, p.volume previous_volume , p.value previous_value, p.capitalisation previous_capitalisation FROM usi c LEFT JOIN usi p ON p.ID = c.ID-1 ORDER BY c.ID DESC_ – Gyne

+0

Да, справедливо, ваш вопрос не указал, что данные были последовательными, и мой ответ сделал предположение. Хотя у вас есть решение сейчас, я опубликовал еще один ответ, в пользу сообщества, который отвечает на ваш вопрос, работая по дате, а не по ID ... Решение, основанное на ID, я уверен, что отлично работает для вас, и решение подзапроса будет медленнее, но, конечно, использование идентификатора, подобного этому, может вызвать проблемы позже - оно также предполагает единообразную последовательную прогрессию идентификаторов ... – Michael