2011-06-08 3 views
0

я работаю в системе регистрации, которая использует следующие таблицы: Person (имя и т.д.), курс (дата курса), регистрация (объединение таблицы Pid, ​​чид)Помощь с MySQL присоединиться к 3 Таблицы

 
Person 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | NO | PRI | NULL |  | 
| name | text | YES |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 

Example Data: 
select * from person; 
+-----+--------+ 
| id | name | 
+-----+--------+ 
| 101 | Graham | 
| 102 | Lisa | 
| 103 | John | 
+-----+--------+ 

Course 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | NO | PRI | NULL |  | 
| name | text | YES |  | NULL |  | 
| date | date | YES |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 

select * from course; 
+----+---------+------------+ 
| id | name | date  | 
+----+---------+------------+ 
| 1 | Hip Hop | 2011-06-08 | 
| 2 | Dancing | 2006-06-23 | 
| 3 | Running | 2007-07-08 | 
+----+---------+------------+ 

Registration 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | NO | PRI | NULL |  | 
| pid | int(11) | YES |  | NULL |  | 
| cid | int(11) | YES |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 

select * from registration; 
+----+------+------+ 
| id | pid | cid | 
+----+------+------+ 
| 1 | 101 | 1 | 
| 2 | 101 | 2 | 
| 3 | 103 | 2 | 

+----+------+------+ 

Я хотел бы найти человека, у которого нет регистрационных записей в течение последних двух лет. Я пытаюсь присоединиться к таблицам на основе расчета даты, но похоже, что это не так. Возможно ли это с помощью mysql или мой подход попробовать это с одним запросом неправильно?

запрос я придумал:

 
select * from 
(person left join registration on person.id = registration.pid) 
left join course on course.id = registration.cid 
AND DATE_FORMAT(`course`.`date`, "%m.%Y") > DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 YEAR),"%m.%Y") 
WHERE 
registration.id IS NULL; 
+-----+------+------+------+------+------+------+------+ 
| id | name | id | pid | cid | id | name | date | 
+-----+------+------+------+------+------+------+------+ 
| 102 | Lisa | NULL | NULL | NULL | NULL | NULL | NULL | 
+-----+------+------+------+------+------+------+------+ 

Он должен перечислить человек, 102 и 103, так как регистрация старше 2-х лет и никаких других записей о новых датах курса можно найти ...

+0

Think подвыборки: 'SELECT * FROM человека WHERE ID NOT IN (SELECT FROM PID .... РЕГИСТРИРУЙТЕСЬ ....)' – Erik

ответ

1

Дайте этот снимок, используя NOT EXISTS положение:

select p.* from person p 
where not exists (select 1 from person px 
        join registration rx on px.id = rx.pid 
        join course cx on rx.cid = cx.id 
        where px.id = p.id 
        and cx.date > DATE_SUB(NOW(), INTERVAL 2 YEAR)) 
+0

он работает благодарственное у ou очень много! – user789945

Смежные вопросы