MYSQL: запрос неправильно учитывает столбец max datetime

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 а timestamp_val - поле TIMESTAMP

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

Я написал следующий запрос, но он не всегда рассматривает строки из таблицы2 с max 'timestamp_val' '

Я вижу значения со старым "timestamp_val", а также в некоторых строках.

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
                        );
Теги:
select
join
inner-join

3 ответа

0

Попробуйте с этим подзапросом, теперь вместо этого используйте идентификатор timestamp:

b.id = (
    SELECT b2.id
    FROM table2 b2
    WHERE
        b2.a_id = b.a_id
        AND b2.check_status = b.check_status
        AND b2.check_type = b.check_type
    ORDER BY b2.timestamp_val desc limit 1
)
  • 0
    Я получаю тот же результат. Все еще видят значения со старым 'timestamp_val'` в некоторых строках.
  • 0
    timestamp_val это поле даты и времени?
Показать ещё 4 комментария
0

измените timestamp_val на DATETIME (6) - где будет отображаться миллисекунды. Затем вы сможете правильно сортировать по времени. https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

0

Попробуйте использовать группу на основе столбца, необходимого для получения максимального времени, и присоединитесь к этому результату

SELECT *  
FROM table1 a INNER JOIN
     table2 b
     ON a.a_id = b.a_id
INNER JOIN (
  SELECT b2.a_id, b2.check_status, b2.check_type, MAX(b2.timestamp_val) as max_time
  FROM table2 b2
  GROUP BY b2.a_id ,  b2.check_status ,  b2.check_type
  ) t on t.a_id = a.a_id  
      AND  t.check_status=b2.check_status 
      AND t.check_type =b2.check_type
      AND b.timestamp_val = t.max_time
WHERE a.create_dt >= '2017-01-07' AND
      b.check_status = 'FAIL' AND
      b.check_type = 'check1'
  • 0
    Я получаю сообщение об ошибке Unknown column 'b2.check_status' in 'on clause'
  • 0
    должно быть AND b.check_status=t.check_status AND b.check_type =t.check_type
Показать ещё 1 комментарий

Ещё вопросы

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