2014-08-27 3 views
0

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

Присутствуют четыре таблицы: пользователь, посещаемость (ссылка «многие-ко-многим») и событие.

Таблица посещаемости просто хранит идентификаторы userId и eventId и являются ли они присутствующими, отсутствующими, больными или в отпуске.

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

Я попытался использовать INNER JOIN от пользователя к посещению, а затем ПРАВОЕ СОЕДИНЕНИЕ от посещения мероприятия, но это должно выполняться индивидуально для каждого пользователя. Я не уверен, что я направляюсь в правильном направлении или уверен, как сделать повторение запроса в SQL.

Заранее благодарен!

Дополнительная информация:

Таблица Пользователь

+-----+---------+ | id | name | +-----+---------+ | 104 | Matthew | | 102 | Kev | | 101 | Julia | +-----+---------+

посещений

+----+--------+---------+------+ | id | userId | eventId | type | +----+--------+---------+------+ | 16 | 104 | 47 | L | | 20 | 104 | 46 | L | | 21 | 104 | 45 | L | | 22 | 102 | 47 | L | | 23 | 102 | 46 | L | | 24 | 102 | 45 | L | | 28 | 102 | 44 | L | | 25 | 101 | 47 | L | | 26 | 101 | 46 | L | | 27 | 101 | 45 | L | +----+--------+---------+------+

События

+----+------------+ | id | date | +----+------------+ | 43 | 2014-08-01 | | 44 | 2014-08-08 | | 45 | 2014-08-15 | | 46 | 2014-08-22 | | 47 | 2014-08-29 | +----+------------+

Моя попытка:

SELECT * FROM `user` 
INNER JOIN attendance ON user.id=userId 
RIGHT JOIN event ON attendance.eventId=event.id 
WHERE event.date BETWEEN '2014-08-01' AND CURDATE() 

Гол

В идеале я хотел бы столик вернулся с USERID и события Id записей, которые не существуют.

+--------+---------+ | userId | eventId | +--------+---------+ | 104 | 43 | | 104 | 44 | | 102 | 43 | | 101 | 43 | | 101 | 44 | +--------+---------+

+2

Опубликуйте свои попытки, структуру таблицы и т. Д.поэтому мы знаем, что вы работаете с –

+0

Это немного помогает? – Martt

+0

Гораздо лучше, приветствия :) –

ответ

0

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

Запрос:

SELECT u.id as 'userID', e.id as 'eventID' 
FROM event e 
JOIN user u 
WHERE e.id NOT IN (
    SELECT DISTINCT event.id FROM event 
    INNER JOIN attendance ON attendance.eventId=event.id 
    WHERE attendance.userId=u.id AND event.date BETWEEN '2014-08-01' AND CURDATE() 
) 
AND e.date BETWEEN '2014-08-01' AND CURDATE() 
ORDER BY u.id DESC; 

Результат:

+--------+---------+ 
| userID | eventID | 
+--------+---------+ 
| 104 |  43 | 
| 104 |  44 | 
| 102 |  43 | 
| 101 |  43 | 
| 101 |  44 | 
+--------+---------+ 

Demo SQL Скрипки:http://sqlfiddle.com/#!2/82dd9f/19/0

+0

Спасибо! Я знал, что мне нужно, но должен был сосредоточиться на присоединениях: D – Martt

0

попробовать это:

SELECT a.*,b.type FROM user a right JOIN attendance b ON a.userId =b.userId WHERE a.userId=<your Value> and b.in eventId in (select event Id from Events where event.date BETWEEN '2014-08-01' AND CURDATE()) 
Смежные вопросы