【问题标题】:Mysql combine rows based on consecutive key values and then mergeMysql根据连续键值组合行然后合并
【发布时间】:2012-12-25 02:54:42
【问题描述】:

非常感谢您的阅读,

我有下表(查看)

#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 并且字段 type = 0 )描述了图书归还的真实日期。新行将包含第一行中包含的所有信息,新列将包含图书的真实归还日期。 Book_ID 和 Loan_person_id 列(用于借书的读者)和 TYPE 列,值为 0(返回)和 1(贷款)。

从我在 SQL 中的基本能力到早期中级能力,我无法正确使用 GROUP BY 和 GROUP CONCAT。 期待答案或方向。
再次感谢, 恐龙

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

处理前: #id_internal type BOOK_ID Writer Title Loan_person_id Loan_Date Return_Date 120 1 1002 作家1 Book1 2 2012-05-21 2012-06-04 131 0 1002 Writer1 Book1 2 0000-00-00 2012-05-21 处理后: 保留两个 id_internal 之一(没关系): #id_internal type BOOK_ID Writer Title Loan_person_id Loan_Date Return_Date Real_Return_Date 120 1 1002 作家1 Book1 2 2012-05-21 2012-06-04 2012-05-21

非常感谢

【问题讨论】:

  • 我建议发布有问题的 SQL。它比所有这些文字更能帮助查明你做错了什么。
  • 对不起,我不被允许发布图片,就像我想的那样。我改用文字。非常感谢您的阅读。
  • 不是桌子;您尝试过的 SQL。
  • 对不起,我尝试的 sql 非常初级,对讨论没有任何价值。再次感谢。
  • 请贴出你想要的结果,这样容易理解

标签: mysql sql


【解决方案1】:

我假设您想要所有图书借阅(类型 = 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 中获取下一次贷款之前的最长日期会复杂得多。

【讨论】:

  • 有效!非常感谢(尊重!)。我认为它会在 sql 语句长度上得到更多扩展。
  • 如果心情不好,请写一行来解释“从 t t2”。它是一个连接吗?是什么类型的?
  • select 子句中的子查询是相关子查询。 t2 是一个别名,用于区分子查询中的“t”和外部查询中的“t”。连接条件同时使用两者。我不喜欢 select 子句中的相关子查询,但在 MySQL 中,这通常是完成您需要完成的事情的唯一方法。
猜你喜欢
  • 2019-06-09
  • 2016-11-18
  • 1970-01-01
  • 2021-06-10
  • 2021-12-12
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多