MySQL:如何在多对多关系中的两个表之间创建映射

MySQL:如何在多对多关系中的两个表之间创建映射,mysql,database,join,many-to-many,Mysql,Database,Join,Many To Many,我有两个相关表格: 受训人员和设备 每个学员都需要使用该设备进行培训,以便允许使用该设备。由于受训者需要在多个设备上接受培训,并且一个设备可以由多个用户使用,因此我在这两者之间建立了多对多关系 因此,MySQLWorkbench为我创建了另一个名为“trainee\u has\u device”的表,其中包含一个指向trainee.Id的外键和一个指向device.Id的外键 到目前为止,一切顺利 我需要获取特定设备上学员的培训状态,因此我在“trainee\u has\u device”上添加

我有两个相关表格:

受训人员和设备

每个学员都需要使用该设备进行培训,以便允许使用该设备。由于受训者需要在多个设备上接受培训,并且一个设备可以由多个用户使用,因此我在这两者之间建立了多对多关系

因此,MySQLWorkbench为我创建了另一个名为“trainee\u has\u device”的表,其中包含一个指向trainee.Id的外键和一个指向device.Id的外键

到目前为止,一切顺利

我需要获取特定设备上学员的培训状态,因此我在“trainee\u has\u device”上添加了属性TrainingStatus。我的桌子看起来像这样:

|trainee|             
--------------------- 
id 
surname
SELECT * FROM trainee LEFT OUTER JOIN trainee_has_device ON trainee_has_device.traineeId = trainee.id LEFT OUTER JOIN device ON device.id = trainee_has_device.deviceId


我需要获取每个设备上每个人的培训值,即使“培训生有设备”中没有条目(如果是,我希望为空)

我的查询如下所示:

|trainee|             
--------------------- 
id 
surname
SELECT * FROM trainee LEFT OUTER JOIN trainee_has_device ON trainee_has_device.traineeId = trainee.id LEFT OUTER JOIN device ON device.id = trainee_has_device.deviceId
但不幸的是,我只得到了列在培训生_has_device或null中的条目

即使“培训生有设备”中没有条目,我如何才能让每个人的培训状态进入每个设备

我需要获得每个设备上每个人的培训价值,即使“培训生有设备”中没有条目

这是没有意义的,必须先填写培训生设备表,否则它不会显示任何数据。在现实世界中,每个任务都必须为所有学员分配一组默认状态(新的、熟悉的…)的设备。因此,如果学员A和设备C之间的连接不可用,则意味着设备C未分配给学员A

我需要获得每个设备上每个人的培训价值,即使“培训生有设备”中没有条目


这是没有意义的,必须先填写培训生设备表,否则它不会显示任何数据。在现实世界中,每个任务都必须为所有学员分配一组默认状态(新的、熟悉的…)的设备。因此,如果培训生A和设备C之间的连接不可用,则表示设备C未分配给培训生A

SELECT trainee.id as TraineeId, trainee.Prename, trainee.Surname, trainee.Mail, trainee.Department,
trainee.Telephone, device.Name as DeviceName, (SELECT IF (trainee_has_device.trainee_id = trainee.id AND
trainee_has_device.device_id = device.id, trainee_has_device.TrainingStatus, 'N/A')
FROM trainee_has_device WHERE trainee_has_device.trainee_id = trainee.id AND device.id = trainee_has_device.device_id) AS TrainingStatus
FROM trainee JOIN device ORDER BY trainee.Surname, trainee.id, device.Name ASC

我设法使它与子查询一起工作:

SELECT trainee.id as TraineeId, trainee.Prename, trainee.Surname, trainee.Mail, trainee.Department,
trainee.Telephone, device.Name as DeviceName, (SELECT IF (trainee_has_device.trainee_id = trainee.id AND
trainee_has_device.device_id = device.id, trainee_has_device.TrainingStatus, 'N/A')
FROM trainee_has_device WHERE trainee_has_device.trainee_id = trainee.id AND device.id = trainee_has_device.device_id) AS TrainingStatus
FROM trainee JOIN device ORDER BY trainee.Surname, trainee.id, device.Name ASC

好吧,我想我明白你的意思。但用这种方法看:如果我想插入一个新的受训人员,而我的设备表中有4个设备,那么我必须在受训人员的设备表中再插入4个。我真的不知道,但这不是一种糟糕的做法吗?@BigPenguin-hmm,如果你没有每个学员-设备对的培训状态,我会建议你避免创建多对多表,只做一个连接,让所有学员使用所有可用设备。也就是说,如果您不打算有选择地将某些设备分配给某些受训人员。但是,由于您需要为每个学员设备对存储一个唯一的状态,因此您必须为每个条目填写该记录以保存初始状态好的,我想我理解您的意思。但用这种方法看:如果我想插入一个新的受训人员,而我的设备表中有4个设备,那么我必须在受训人员的设备表中再插入4个。我真的不知道,但这不是一种糟糕的做法吗?@BigPenguin-hmm,如果你没有每个学员-设备对的培训状态,我会建议你避免创建多对多表,只做一个连接,让所有学员使用所有可用设备。也就是说,如果您不打算有选择地将某些设备分配给某些受训人员。但是,由于您需要为每个学员设备对存储唯一的状态,因此您必须为每个条目填写该记录以保存初始状态