MYSQL: выборка последних строк из второй таблицы на основе значения метки времени

0

У меня есть таблица table1 a_id, как PK, ipaddress, create_dt Здесь ipaddress является varchar, create_dt является datetime

a_id    ip              create_dt
9205    10.10.10.10     2017-01-07 08:03:32
9206    10.10.10.11     2017-01-06 08:03:32
9207    10.10.10.12     2015-01-07 08:03:32

---more, чем 1000 строк

У меня есть другая таблица mysql со следующими столбцами id как PK, ip, check_type check_status, a_id и created_dt: Здесь a_id - это внешний ключ из table1 а created_dt - datetime

id      ip             check_type    check_status  a_id    timestamp_val
1       10.10.10.10    check1        FAIL          9205    2017-01-07 10:03:32
2       10.10.10.10    check2        PASS          9205    2017-01-07 10:03:32
3       10.10.10.10    check1        FAIL          9205    2016-11-07 10:03:32
4       10.10.10.10    check2        PASS          9205    2016-11-07 10:03:32
5       10.10.10.11    check1        PASS          9206    2017-01-06 10:03:32
6       10.10.10.11    check2        PASS          9206    2015-01-06 10:03:32

Мне нужны все строки из table1 где date(create_dt) >= '2017-01-07' и table1.a_id = table2.a_id и table2.check1 = 'FAIL' Кроме того, I only want to consider the row from table2 с последним timestamp_val

Поэтому из приведенного выше примера мой запрос должен вернуться

a_id    ip              create_dt
9205    10.10.10.10     2017-01-07 08:03:32

Я написал следующий запрос и want to know how to incorporate the logic to consider the row from table2 with latest 'timestamp_val'

SELECT
  *
FROM table1 a
INNER JOIN table2 b
  ON a.a_id = b.a_id
  AND DATE(a.create_dt) >= '2017-01-07'
  AND b.check_status = 'FAIL'
  AND b.check_type = 'check1'
Теги:
select
inner-join

2 ответа

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

Функция date() ничего не делает для вас. Кроме того, индивидуальные сопоставления обычно будут в предложении where.

Затем вы можете делать то, что хотите, с дополнительным условием в предложении where:

SELECT *  
FROM table1 a INNER JOIN
     table2 b
     ON a.a_id = b.a_id
WHERE a.create_dt >= '2017-01-07' AND
      b.check_status = 'FAIL' AND
      b.check_type = 'check1' AND
      b.timestamp_val = (SELECT MAX(b2.timestamp_val)
                         FROM table2 b2
                         WHERE b2.a_id = b.a_id AND
                               b2.check_status = b.check_status AND
                               b2.check_type = b.check_type
                        );
  • 0
    Я не получаю правильный результат с помощью этого запроса. Я думаю, что для некоторых строк это не принимает максимальное значение столбца timestamp_val
  • 0
    @meallhour. , , , Это максимальное значение метки времени, которое соответствует трем условиям. Возможно, я неверно истолковал вопрос, и условия для check_status и check_type не нужны.
Показать ещё 1 комментарий
0
SELECT *  
FROM table1 a
INNER JOIN table2 b
  ON a.a_id = b.a_id
    AND date(a.create_dt) >= '2017-01-07'
    AND b.check_status = 'FAIL'
    AND b.check_type = 'check1'
ORDER BY timestamp_val desc 
LIMIT 1
  • 0
    это всегда будет возвращать только 1 запись. Я думаю, что это не полезно.
  • 2
    Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную краткосрочную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.

Ещё вопросы

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