2015-09-13 3 views
3

Я пытаюсь написать запрос для выбора из 2 таблиц.Присоединиться к двум таблицам SQL-запрос

Таблицы являются следующие:

Table_1: 
id (int) 
name (varchar) 
status int (0,1) 

Table_2: 
id (int) 
table_1_id (int) 
name (varchar) 
time (datetime) 

Мне нужно, чтобы выбрать все строки из Table_2, которые не являются не старше 1 день и которые связаны с table_1 со статусом 1. То, как я это делаю сейчас с помощью 2 запроса и 2 массива foreach, что очень неэффективно. Может ли кто-нибудь помочь мне написать запрос с присоединением? Спасибо за ваше время.

ответ

3

Нет необходимости зацикливание, вы можете сделать JOIN между таблицами, как

select t2.* 
from Table_2 t2 join Table_1 t1 on t2.table_1_id = t1.id 
where t1.status = 1 
and date(t2.`time`) = date(now() - interval 1 day); 
+0

Вы избили меня до 6 минут. Ваша точка. ;) –

2
SELECT table_2.* FROM table_1 t1 INNER JOIN table_2 t2 ON t2.table_1_id=t1.id 
WHERE t1.status=1 AND time < (NOW() - INTERVAL 1 DAY); 

Вы должны использовать ON для объединения таблиц Поскольку поля в вопросе не имеют такое же имя. В противном случае вы могли бы присоединиться к USING(id_field). В вашем случае внутреннее соединение, вероятно, наиболее полезно. Вы могли бы использовать левое соединение, если хотите, чтобы результаты соответствовали таблице_1, даже если в таблице_2 нет аналога.

2

Не требуется 2 запроса. Вы можете использовать 1 запрос как:

SELECT t2.* FROM Table_1 t1, Table_2 t2 
WHERE t1.id = t2.table_1_id AND 
    t1.status = 1 AND 
    DATE(t2.'time') >= DATE(now() - INTERVAL 1 DAY) 

Потому что вы хотите

Мне нужно, чтобы выбрать все строки из Table_2, которые не старше 1 день

поэтому мы не должны быть больше чем оператор или равный:

DATE(t2.'time') >= DATE(now() - INTERVAL 1 DAY)