#mysql
#mysql
Вопрос:
Я построил это:
[ Таблица Workshop_templates ]
id_template | Workshop_name
1 | Conflict resolution
2 | Building trust
3 | Demencia
4 | Management
[ Таблица Workshop_instances ]
id_workshop_instance | id_template | archived
18 | 1 | 1
23 | 3 | 0
[ Таблица регистраций]
username | id_workshop_instance
user1 | 18
user1 | 23
Мне нужно отображать только Workshop_templates.workshop_name (ы) user1 никогда не регистрировался.
Результатом здесь будет «Повышение доверия (2)» и «Управление (4)».
Я написал что-то вроде этого:
(SELECT.FROM.)
WHERE id_workshop_instance
NOT IN (
SELECT id_workshop_instance
FROM Registrations
WHERE Registrations.username = Users.username )
AND Workshop_instances.id_template = Workshop_templates.id_template
AND Users.username = 'user1'
AND Workshop_instances.archived != 1
Проблема в том, что этот запрос работает отлично, исключая взятые семинары в целом, но в любом случае он отобразит "Разрешение конфликта (1)" .... (потому что archived == 1?)....
Ответ №1:
Возвращает все имена мастерских, где 'user1' отсутствует в таблице workshop_instance. ЛЕВЫЕ соединения возвращают все записи из таблицы СЛЕВА и только совпадающие записи из таблицы справа.
Поскольку мы всегда хотим, чтобы все семинары начинались с, а затем мы хотим ИСКЛЮЧИТЬ те, которые были приняты пользователем one. мы используем левые соединения и помещаем user1 в соединение. Включение его в where приведет к отрицанию левых соединений (если вы не включаете (username = 'user1' или username равно null), затем, указав, что нас интересуют только случаи, когда не существует экземпляра экземпляра Workshop, мы получаем шаблоны, с которыми пользователь 1 не был связан.
Select WT.workshop_Name
FROM workshop_Templates WT
LEFT JOIN WorkShop_Instances WI
on WT.id_Template = WI.Id_template
LEFT JOIN Registrations R
on R.Id_Workshop_Instance = WI.id_workshop_Instance
and username = 'user1'
WHERE WI.ID_template is null;
--Обновлено, где WT было неверным, должно было быть WI
Комментарии:
1. Спасибо за ваше четкое объяснение! Я пытаюсь выполнить этот запрос, но я застрял на странной ошибке SQL "неизвестный столбец WT.id_template" в ограничении левого соединения.... Я просто продолжаю копировать / вставлять из БД... WQill сообщит вам, как это сделать, как только я решу эту проблему.
2. Чрезвычайно странно. Workshop_Templates. ID_Template - правильное ли имя таблицы / поля? (Может быть, чувствительность к регистру?)