2015-10-14 28 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

這很有用@Michael。我其實曾嘗試過,但在WHERE子句中獲得股票。感謝這個_(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列創建一個索引。

+0

非常感謝邁克爾。您的解決方案按預期方式檢索單行中的所有內容,但我現在意識到,無論上一個日期是週末還是公共假日,都會檢索到空值,但是該日期的表中沒有數據存在於該表中。間隔日期或任何其他解決方案是否可以通過將present_date設置爲1行來檢索前一個日期。這樣就不會有空行。然後,我可以通過present_date來訂購。是的,我在present_date上有一個唯一的鍵索引。在此先感謝 – Gyne

+0

再次感謝@邁克爾,但我現在已經解決了。我創建了一個自動增量ID字段,然後通過將值1設置爲off來設置previous_date,從而在連接中使用它。以下是我使用的查詢。 _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的解決方案我確信你的工作正常,子查詢解決方案是會變得更慢,但當然使用這樣的ID可能會在稍後導致問題 - 它也會假定統一連續的ID進展... – Michael