У меня есть таблица 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'
Функция 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
);
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
timestamp_val
check_status
иcheck_type
не нужны.