Mysql根据连续的键值组合行,然后合并

时间:2012-12-24 18:16:11

标签: mysql sql

非常感谢阅读,

我有下表(查看)

#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

创建了基本模型我的小型应用程序的学校图书馆贷款日志。

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

这就是该集合的一行(类型= 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


非常感谢

1 个答案:

答案 0 :(得分:0)

我假设您想要所有图书贷款(类型= 1),因此ID 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中获得下一次贷款之前的最大日期将会复杂得多。