mysql объединяется с минимальным значением внутри группы - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь написать запрос.

Мой стол:

+----+---------+------------+
| id | user_id |    date    |
+----+---------+------------+
|  1 |       1 | 2013-04-01 |
|  2 |       1 | 2017-01-01 |
|  3 |       1 | 2018-07-01 |
|  4 |       2 | 2018-09-01 |
|  5 |       2 | 2018-05-01 |
|  6 |       3 | 2018-10-01 |
|  7 |       1 | 2012-01-01 |
|  8 |       3 | 2016-06-01 |
|  9 |       3 | 2011-01-01 |
| 10 |       1 | 2000-01-01 |
+----+---------+------------+

Ожидаемый результат:

+----+---------+------------+-------------+
| id | user_id |    date    | first_login |
+----+---------+------------+-------------+
|  1 |       1 | 2013-04-01 | 2000-01-01  |
|  2 |       1 | 2017-01-01 | 2000-01-01  |
|  3 |       1 | 2018-07-01 | 2000-01-01  |
|  4 |       2 | 2018-09-01 | 2018-05-01  |
|  5 |       2 | 2018-05-01 | 2018-05-01  |
|  6 |       3 | 2018-10-01 | 2011-01-01  |
|  7 |       1 | 2012-01-01 | 2000-01-01  |
|  8 |       3 | 2016-06-01 | 2011-01-01  |
|  9 |       3 | 2011-01-01 | 2011-01-01  |
| 10 |       1 | 2000-01-01 | 2000-01-01  |
+----+---------+------------+-------------+

Возможно ли это? мне кажется, что это комбинация соединений!

Я пробовал это, но это не работает. казнь бесконечна.

CREATE TABLE CONNEXIONS
    (`id` int, `user_id` int, `date` date)
;

INSERT INTO CONNEXIONS
    (`id`, `user_id`, `date`)
  VALUES
    (1, 1, '2013-04-01'),
    (2, 1, '2017-01-01'),
    (3, 1, '2018-07-01'),
    (4, 2, '2018-09-01'),
    (5, 2, '2018-05-01'),
    (6, 3, '2018-10-01'),
    (7, 1, '2012-01-01'),
    (8, 3, '2016-06-01'),
    (9, 3, '2011-01-01'),
    (0, 1, '2000-01-01')
  ;


SELECT  conn.*, c.first_login
FROM CONNEXIONS AS conn

INNER JOIN (
    SELECT MIN(conn.date) AS first_login, user_id
    FROM CONNEXIONS AS conn
    GROUP BY conn.user_id
) c ON (conn.user_id = c.user_id)

редактирование: Я допустил ошибку в запросе: MAX вместо MIN и client_id вместо user_id.

Ответы [ 4 ]

0 голосов
/ 08 ноября 2018

Стоит отметить, что в MySQL 8+ вы бы использовали стандартные оконные функции:

SELECT c.*,
       MIN(c.date) OVER (PARTITION BY c.user_id) as first_login
FROM CONNEXIONS c;
0 голосов
/ 08 ноября 2018

Вы можете использовать correlated подзапрос, и вам нужно MIN() вместо MAX():

SELECT CONN.*,
       (SELECT MIN(conn1.date)
        FROM CONNEXIONS conn1
        WHERE conn1.user_id = conn.user_id
       ) AS first_login
FROM CONNEXIONS conn;
0 голосов
/ 08 ноября 2018

просто используйте min() вместо max(), и вам нужно сгруппировать по user_id

SELECT  conn.*, c.first_login
FROM CONNEXIONS

INNER JOIN (
    SELECT min(conn.date) AS first_login, user_id
    FROM CONNEXIONS AS conn
    GROUP BY conn.user_id
) c ON (conn.user_id = c.user_id)
0 голосов
/ 08 ноября 2018
  • Я считаю, что first_login будет минимальной датой подключения, а не максимальной.
  • Ваш псевдоним был неуместен. Я исправил это.

Попробуйте:

SELECT  conn1.*, c.first_login
FROM CONNEXIONS AS conn1
INNER JOIN (
    SELECT MIN(conn2.date) AS first_login, conn2.user_id
    FROM CONNEXIONS AS conn2
    GROUP BY conn2.user_id
) c ON (conn1.user_id = c.user_id)

Результат

| id  | user_id | date       | first_login |
| --- | ------- | ---------- | ----------- |
| 1   | 1       | 2013-04-01 | 2000-01-01  |
| 2   | 1       | 2017-01-01 | 2000-01-01  |
| 3   | 1       | 2018-07-01 | 2000-01-01  |
| 4   | 2       | 2018-09-01 | 2018-05-01  |
| 5   | 2       | 2018-05-01 | 2018-05-01  |
| 6   | 3       | 2018-10-01 | 2011-01-01  |
| 7   | 1       | 2012-01-01 | 2000-01-01  |
| 8   | 3       | 2016-06-01 | 2011-01-01  |
| 9   | 3       | 2011-01-01 | 2011-01-01  |
| 0   | 1       | 2000-01-01 | 2000-01-01  |

Посмотреть на скрипку БД

...