У меня есть таблица 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
);
Попробуйте с этим подзапросом, теперь вместо этого используйте идентификатор 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
)
измените timestamp_val на DATETIME (6) - где будет отображаться миллисекунды. Затем вы сможете правильно сортировать по времени. https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html
Попробуйте использовать группу на основе столбца, необходимого для получения максимального времени, и присоединитесь к этому результату
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'
Unknown column 'b2.check_status' in 'on clause'
AND b.check_status=t.check_status AND b.check_type =t.check_type