2012-12-24 56 views
1

阅读非常感谢,Mysql的基础上连续键值合并行,然后合并

我有如下表(图)

#id_internal type BOOK_ID  Writer  Title  Loan_person_id Loan_Date  Return_Date 
    120  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    131  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
    134  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
    153  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    162  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
    165  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    252  1  1012 Writer2   Book2  2   2012-05-23  2012-06-06 
    253  0  1012 Writer2   Book2  2   0000-00-00  2012-05-23 
    383  1  1012 Writer2   Book2  2   2012-05-23  2012-06-06 
    389  0  1012 Writer2   Book2  2   0000-00-00  2012-05-24 
    13  1  1008 Writer3   Book3  3   2012-05-20  2012-06-03 
创建

基本上机型我的小APPLICA!重刑学校图书馆借阅日志。

我想找出一种方法来创建一个sql语句,将执行以下操作:基于id_internal字段(显示在图片中)一次合并两行(前两行 - 更多两个等,直到没有元组存在或者最后只有一个元组),并创建一个具有更多列的新元组。

这是关于什么的是,该集合中的一行(type = 1)描述了借书借贷,即书借出的时间和应该返还给图书馆的时间。第二行(总是Loan_Date的时间为0000:00:00,字段类型= 0)描述了该书返回的真实日期。新行将包含在第一行中的所有信息以及作为新列的书的真实返回日期。对于Book_ID和Loan_person_id(对于借阅本书的读者)和TYPE分别具有值0(返回)和1(贷款)的列。

从SQL的基本到早期的中级能力,我无法正确使用GROUP BY和GROUP CONCAT。 期待解答或指示。
再次感谢, 迪诺斯

编辑:结果应该是在形式(让我们用一个视图)

 
Before Processing: 
#id_internal type BOOK_ID  Writer  Title  Loan_person_id Loan_Date  Return_Date 
    120  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04 
    131  0  1002 Writer1   Book1  2   0000-00-00  2012-05-21 
After processing : 
Keep one of two id_internal (does not matter): 
#id_internal type BOOK_ID  Writer  Title  Loan_person_id Loan_Date  Return_Date Real_Return_Date 
    120  1  1002 Writer1   Book1  2   2012-05-21  2012-06-04  2012-05-21 


非常感谢

+0

我建议发布有问题的SQL。这将有助于明确你所做的错误比所有这些文字更好。 – duffymo

+0

对不起,我没有被允许发布图片,因为我认为。我用文字代替。非常感谢您的阅读。 –

+0

不是表格;你尝试过的SQL。 – duffymo

回答

0

我假设你希望所有的书贷款(类型= 1),所以标识120和153应该是分开的行。

下面的查询需要发生的书的最低贷款日期之后给定的贷款:

select t.*, 
     (select min(ReturnDate) from t t2 where t.bookid = t2.bookid and t2.id > t.id and t2.type = 0) as ReturnDate 
from t 
where type = 1 

这适用于你的数据,因为131和134具有相同的日期。在下一笔贷款之前获取最大日期在MySQL中会更加复杂。

+0

它的工作原理!许多非常感谢(尊重!)。我认为它会在sql语句长度中得到更多的扩展。 –

+0

如果在心情下降线来解释“从t t2”。它是一个什么样的连接? –

+0

'select'子句中的子查询是一个相关的子查询。 't2'是用于区分子查询中的“t”和外部查询中的“t”的别名。连接条件使用两者。我不是select子句中相关子查询的忠实粉丝,但是在MySQL中,这通常是完成所需工作的唯一方法。 –