【问题标题】:Group values in sets without overlaping对集合中的值进行分组而不重叠
【发布时间】:2020-04-16 20:21:58
【问题描述】:

拥有这个数据集:

CREATE TABLE IF NOT EXISTS `details` (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `item` INT(6) NOT NULL,
  `dateOut` DATE,
  `dateIN` DATE
);

INSERT INTO details VALUES
  (1,1, '2020.04.11', '2020.04.11'),
  (2,1, '2020.04.12', '2020.04.12'),
  (3,1, '2020.04.13', '2020.03.11'),
  (4,1, '2020.04.13', '2020.04.13'),
  (5,1, '2020.04.14', '2020.03.11');

fiddle。 是否有可能在 mysql/php(laravel) 中得到这个结果:

2020-04-11 => [id: 1,3,5]
2020.04.12 => [id: 2]
2020.04.13 => [id: 4]

意思是dateIN <= min(dateOut) 将值分组,然后与剩余的值(从集合中删除第一组)重复。

所以第一次 min(dateOut) 是2020-04-11。 ID:1,3,5dateIn 2020-04-11 所以我将它们分组。从初始集合中删除 id 1,3,5

那么在剩余的值上 min(dateOut) 是 2020-04-12 并且只有 Id: 2dateIn 2020-04-12。删除 id 2

那么在剩余的值上 min(dateOut) 是 2020-04-13 并且只有 Id: 4dateIn 2020-04-13。移除 id 4 等等,直到所有值都被分组。

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    我认为在您的应用程序代码中过滤此结果会很简单...

    SELECT x.*
         , GROUP_CONCAT(y.id ORDER BY y.id) canidiates
      FROM details x 
      JOIN details y   
        ON y.datein <= x.dateout 
     GROUP 
        BY x.id;
    +----+------+------------+------------+------------+
    | id | item | dateOut    | dateIN     | canidiates |
    +----+------+------------+------------+------------+
    |  1 |    1 | 2020-04-11 | 2020-04-11 | 1,3,5      |
    |  2 |    1 | 2020-04-12 | 2020-04-12 | 1,2,3,5    |
    |  3 |    1 | 2020-04-13 | 2020-03-11 | 1,2,3,4,5  |
    |  4 |    1 | 2020-04-13 | 2020-04-13 | 1,2,3,4,5  |
    |  5 |    1 | 2020-04-14 | 2020-03-11 | 1,2,3,4,5  |
    +----+------+------------+------------+------------+
    

    【讨论】:

    • 我不知道如何创建过滤循环。
    • 好吧,我可能会尝试拼凑一些东西,虽然这不是我的强项,但基本上你有两个数组;一个代表当前行,一个代表所有先前行的累积(不同)值。然后,您只需查看这些数组之间的区别。
    猜你喜欢
    • 2023-02-05
    • 1970-01-01
    • 2021-10-31
    • 2022-10-14
    • 2018-06-22
    • 2021-11-16
    • 1970-01-01
    • 2020-08-19
    • 2011-04-13
    相关资源
    最近更新 更多