Внутреннее объединение двух таблиц с результатами даты

0

Результат должен показать мне, какие активные клиенты не были посещены за последние 15 дней, согласно сегодняшней дате.

Две таблицы, которые у меня есть:

**Table: subscription**
------------------------------------
id | client_id | expiring
------------------------------------
1  |    253    | 2018-03-22 00:00:00
2  |    265    | 2018-02-14 00:00:00
3  |    274    | 2018-05-29 00:00:00
------------------------------------

**Table: checkins**
------------------------------------
id | client_id | date
------------------------------------
1  |    253    | 2018-01-18 13:18:21
2  |    265    | 2017-12-14 16:18:23
3  |    274    | 2018-02-25 15:01:09
------------------------------------

Поэтому конечный результат должен показать мне 1 результат с client_id 253

  • 0
    ваш пример не понятен ..
  • 0
    Какая сегодня дата?
Показать ещё 3 комментария
Теги:
select
inner-join

3 ответа

0
Лучший ответ

Я думаю, это то, что вы хотите:

select distinct s.client_id from subscription s
where s.expiring >= current_date()
and not exists (
  select 1 from checkins c
  where datediff(current_date(), c.date) <= 14
  and c.client_id = s.client_id
)

Первое условие в предложении where ограничивает результат для активных клиентов, а второе условие исключает клиентов, которые были посещены за последние 14 дней.

Пример SQL Fiddle

  • 0
    Что происходит, если для клиента нет чеков?
  • 0
    Этот показывает мне множество строк для результата, и я вижу, что client_id появляется более одного раза, например, client_id 4 появляется в результатах 65 раз, которые являются суммой его проверок. В какой части вашего запроса должен быть установлен предел для каждого client_id?
Показать ещё 6 комментариев
0

Я имитирую ваши обе таблицы, как показано ниже:

mysql> select * from t03;
+------+-----------+---------------------+
| id   | client_id | expiring            |
+------+-----------+---------------------+
|    1 |       253 | 2018-03-22 00:00:00 |
|    2 |       265 | 2018-02-14 00:00:00 |
|    3 |       274 | 2018-05-29 00:00:00 |
+------+-----------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from t04;
+------+-----------+---------------------+
| id   | client_id | date                |
+------+-----------+---------------------+
|    3 |       274 | 2018-02-25 15:01:09 |
|    2 |       265 | 2017-12-14 16:18:23 |
|    1 |       253 | 2018-01-18 13:18:21 |
+------+-----------+---------------------+

и все, что вам нужно, это следующий код.

select * from t04 where client_id in (select client_id from t03 where expiring > current_date()) and datediff(current_date() ,date) > 15  ;

и тогда ваш результат будет получен следующим образом:

+------+-----------+---------------------+
| id   | client_id | date                |
+------+-----------+---------------------+
|    1 |       253 | 2018-01-18 13:18:21 |
+------+-----------+---------------------+
0

Ну вот. Вот запрос, чтобы извлечь конкретный результат

select * from checkins t1 join subscription t2 on t1.client_id=t2.client_id where
date(t2.expiring) >= date(NOW()) and datediff(current_date(), date(t1.date)) > 14;
  • 0
    Вам необходимо добавить тесты для части вопроса «последние 15 дней».
  • 0
    именно этот запрос не имеет ничего общего с 15 днями
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню