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