Mysql — исключение по таблицам работает .. почти

#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 - правильное ли имя таблицы / поля? (Может быть, чувствительность к регистру?)