Mysql - 跨表的排除工作..几乎

时间:2014-06-24 14:47:32

标签: mysql

我建立了这个:

[Workshop_templates table]
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


我只需要显示用户1从未注册的Workshop_templates.workshop_name(。) 结果将是' Buidling trust(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)'无论如何....(因为存档== 1?)....

1 个答案:

答案 0 :(得分:0)

返回所有研讨会名称' user1'不在workshop_instance表中。 LEFT Joins返回LEFT表中的所有记录,只返回右侧表中的匹配记录。

由于我们总是希望所有研讨会都要开始,然后我们想要排除用户所采用的研讨会。我们使用左连接并将user1放在连接上。把它放在哪里会否定左连接(除非你包括(用户名=' user1'或者用户名为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不正确的地方