У меня есть таблица 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
: Здесь a_id
- это внешний ключ из table1
id ip check_type check_status a_id
1 10.10.10.10 check1 FAIL 9205
2 10.10.10.10 check2 PASS 9205
3 10.10.10.11 check1 PASS 9206
4 10.10.10.11 check2 PASS 9206
Мне нужны все строки из table1
где date(create_dt) >= '2017-01-07'
и table1.a_id = table2.a_id
и table2.check1 = 'FAIL'
Поэтому из приведенного выше примера мой запрос должен вернуться
a_id ip create_dt
9205 10.10.10.10 2017-01-07 08:03:32
Я написал следующий запрос и хочу узнать, есть ли лучший способ написать запрос. Следующий запрос кажется немного медленнее
SELECT *
FROM table1 a
INNER JOIN table2 b
ON a.a_id = b.a_id
WHERE date(a.create_dt) >= '2017-01-07'
AND
b.check_status = 'FAIL'
AND b.check_type = 'check1'
Сделайте то, что вы используете внутреннее соединение, вы можете назначить условие в том месте, где прямо в пункте on on
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'
Результат один и тот же. Это просто другой способ выражения условия jon
Я написал следующий запрос и хочу знать, есть ли лучший способ написать запрос
Ваш запрос выглядит хорошо. Вы присоединились к двум таблицам с определенным ключом и применили предложения where, которые вы хотели. Итак, мое предложение состояло бы в том, чтобы не указывать дату, например date(a.create_dt)
. create_dt
преобразуйте create_dt
в поле date
. Применение кастинга может привести к снижению производительности запросов. По возможности старайтесь избегать такого рода отливок.