Группировать значения в наборах без наложения - PullRequest
1 голос
/ 16 апреля 2020

Имея этот набор данных:

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');

скрипка . Можно ли получить этот результат в 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. Идентификаторы: 1,3,5 имеют dateIn <= <code>2020-04-11, поэтому я сгруппировал их. Удалите id 1,3,5 из исходного набора.

Тогда для оставшихся значений min (dateOut) будет 2020-04-12, и только Id: 2 имеет dateIn <= <code>2020-04-12. Удалите id 2.

Тогда для оставшихся значений min (dateOut) будет 2020-04-13, и только Id: 4 имеет dateIn <= <code>2020-04-13. Удалите id 4 и т. Д., Пока все значения не будут сгруппированы.

1 Ответ

0 голосов
/ 16 апреля 2020

Я думаю, было бы просто отфильтровать этот результат в коде вашего приложения ...

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  |
+----+------+------------+------------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...