2012-06-01 6 views
3

У меня есть 3 таблицы, t1 содержит события, t2, содержащие «посещаемые» события, и t3, содержащие некоторые приглашенные идентификаторы пользователей (связанные с идентификаторами пользователей системы). Более одного пользователя могут присутствовать и события.MySQL join - данные не во второй таблице

Когда создается новое событие, оно вставляется в t1. Каждый раз, когда пользователь подтверждает посещение события, строка вставляется в t2, в противном случае таблица t2 пуста.

Нижеприведенный запрос вытаскивает все события, которые пользователь посещает.

SELECT * FROM events t1 
INNER JOIN attending_events t2 ON t1.id_ev = t2.id_ev 
INNER JOIN attending_users t3 ON t2.id_user = t3.id_user AND t3.id_system_user=17 
WHERE t1.id_comp = 42 

Пожалуйста, помогите, мне нужен запрос, чтобы сделать полную противоположность, найти события, которые пользователь не посещает.

+0

Если события с 'id_comp <> 42' возвращается? – Quassnoi

+0

@Quassnoi: Нет, только события из id_bcomp = 42 должны быть возвращены. – noru

ответ

3
SELECT e.* 
FROM events e 
WHERE e.id_ev NOT IN 
     (
     SELECT id_ev 
     FROM attending_events ae 
     JOIN attending_users au 
     ON  au.id_user = ae.id_user 
     WHERE au.system_user_id = 17 
     ) 
     AND id_comp = 42 

или:

SELECT * 
FROM events e 
LEFT JOIN 
(
     attending_events ae 
JOIN attending_users au 
ON  au.id_user = ae.id_user 
) 
ON  ae.id_ev = e.id_ev 
     AND au.system_user_id = 17 
WHERE e.id_comp = 42 
     AND ae.id_ev IS NULL 
+0

Спасибо! Пока это единственный способ работы, и я буду использовать его, если не найду лучшего решения (без использования двух операторов SELECT). – noru

+0

@noru: что плохого в двух операторах SELECT? – Quassnoi

+0

Мой босс ненавидит их и всегда заставляет меня искать по-другому: | – noru

0
select * from attending_events where id_ev not in 
(SELECT id_ev FROM events t1 
INNER JOIN attending_events t2 ON t1.id_ev = t2.id_ev 
INNER JOIN attending_users t3 ON t2.id_user = t3.id_user AND t3.id_system_user=17 
WHERE t1.id_comp = 42) 

Первое, что пришло мне в голову. Определенно нужно оптимизировать.

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