MySQL之从一个表中的两个Id分别获取另一个表中对应这两个Id的名字

本文介绍如何在MySQL中通过两个不同的ID(senderId和recipientId)分别从另一个表中获取对应的姓名,并在同一行显示。该解决方案适用于需要从关联表中提取多个相关记录的场景。

MySQL之从一个表中的两个Id分别获取另一个表中对应这两个Id的名字。

我写的MySQL之从一个表中的两个Id分别获取另一个表中对应这两个Id的名字,供自己以后学习使用。

http://blog.sina.com.cn/s/blog_149e9d2ec0102voyy.html


简介:

做MySQL的查询时遇到一个相当头大的问题,就是通过notice数据库中senderId和recipientId获取user数据库中对应的两个名字,并且在一行显示,注意不是在一个字段中显示(注:在一个字段中显示可以用group_concat()函数实现)。

经过大神的指教我终于解决了这样的问题,对这位大神表示真诚的感谢。以下是详情:

1. 首先数据表notice:

create table if not exists notice(

noticeId int(11) NOT NULL AUTO_INCREMENT COMMENT '自增通知ID',

senderId int(11) NOT NULL COMMENT '发送人ID,发送人可以是每个员工',

sendDateTime datetime not null COMMENT '通知发送时间',

noticeTitle varchar(255) COMMENT'通知标题', 

noticeContent text COMMENT '发送内容',

deadLine date COMMENT '通知截止日期',

noticeState int(1) COMMENT'通知状态, 0:未查看,1:已查看,2 :未过期,3:已过期,,4:确认查看',

receptOfficeId int(11) COMMENT '接受科室ID',

recipientId int(11) COMMENT '接收人ID,接收人可以是单位中的任何一个员工',

receptDateTime datetime COMMENT '接受通知时间',

primary key(noticeId)

)ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

2. 插入一条数据为:

insert intonotice(senderId,sendDateTime,noticeTitle,sendContent,recipientId)

values(11,now(),'吃饱了','吃饱不饿,天天快乐。',13)

3. 有另一个数据表user

create table if not exists user(

userid int(11),

realName varchar(10)​

)ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

4. 插入数据:

insert into user(userid,realName)values(11,'宋腾飞'),('13','王福栋');

5. 想要的结果

senderId   realname        aa         bb

  11            宋腾飞        13       王福栋

​​​​6. MySQL代码

 

SELECT a.senderId

      ,b.realname    

,aa.recipientId      

,aa.realname

 FROM notice  a

INNER JOIN USER b

ON  b.userid=a.senderId

LEFT JOIN (SELECTa.recipientId      

,b.realname      

,a.`noticeId`

FROM  notice  a

INNER JOIN USER b

ON  b.userid=a.recipientId) aa

ON aa.`noticeId`=a.`noticeId`



<think>我们讨论的是在MySQL中实现两个字段的一一对应关系。注意,这里的一一对应是指:对于字段A的每个值,字段B有且只有一个值与之对应,反之亦然。这类似于数学中的双射(bijection)关系。 在数据库设计中,一对一关系通常通过以下方式实现: 1.在同一中:如果两个字段都在同一中,我们可以通过添加唯一约束(UNIQUE constraint)来确保一对一关系。具体来说,我们可以对两个字段分别创建唯一约束,这样每个值在各自字段中都是唯一的,并且相互对应。 2.通过两:如果两个字段位于不同的中,则可以通过外键(FOREIGNKEY)约束并设置唯一索引来实现。根据用户的问题,他提到的是“一个两个字段”,所以是在同一中。 实现步骤:1.确保两个字段都是唯一的(即每个字段的值在中都是唯一的),并且不允许NULL(如果允许NULL,则可能破坏一一对应,因为多个NULL值可能被认为不唯一,但在MySQL中,唯一约束允许有多个NULL值,除非使用NOT NULL约束)。2.为两个字段分别添加唯一约束(UNIQUE constraint)。 但是,注意:仅仅两个字段各自唯一并不能完全保证一一对应。例如:T有字段A和B,我们为A和B分别添加唯一约束。那么可能出现:A1->B1, A2->B2,但是也可以出现A1->B1,A2->B1吗?不行,因为B1在B字段中必须唯一,所以B1只能出现一次。同样,A1也只能出现一次。因此,实际上,两个字段各自唯一,那么它们之间就自然形成了一一对应关系吗?不一定,因为可能A1->B1,而A2->B2,但并没有要求A1和B2之间有什么关系。我们要求的是A和B的每个值都唯一,并且每个A值对应一个B值,每个B值对应一个A值。在这种情况下,由于A唯一,B唯一,那么每一行就是一个对应对,且不会出现重复的A或重复的B。因此,整个关系就是一一对应的。但是,有一个潜在问题:如果中有两行,比如(A1,B1)和(A2, B2),那么A1和B2之间没有直接对应关系,但是我们的要求是A和B之间一一对应,实际上是指在一个关系中,每个A值对应一个B值,每个B值对应一个A值。所以,我们只需要保证没有重复的A和重复的B即可。 因此,在同一中,我们可以通过以下方式实现: -将两个字段都设置为唯一(UNIQUE)且非空(NOT NULL)。 示例SQL: ```sqlCREATE TABLEexample (idINT PRIMARYKEY AUTO_INCREMENT,field1 VARCHAR(255) NOTNULL,field2 VARCHAR(255) NOTNULL,UNIQUE (field1),UNIQUE(field2)); ```这样,field1和field2都必须是唯一的,并且不能为空,从而形成一一对应关系。注意:如果允许NULL,那么唯一约束允许有多个NULL值(在MySQL中),所以为了严格一一对应,我们要求非空。 但是,用户的要求是“一一对应”,所以不允许NULL值,否则NULL值会破坏一一对应(因为多个NULL值无法区分)。 外,如果用户希望两个字段互相引用,即一个字段的值决定了一个字段的值,并且反之亦然,那么这种设计可以满足。但是,我们也要考虑实际应用场景:通常,一对一关系在数据库设计中并不常见,因为如果两个字段如此紧密相关,它们可能应该合并成一个字段,或者使用同一个字段。不过,有些情况下可能需要两个不同的标识符,例如一个内部ID一个外部ID,并且要求它们一一对应。 相关问题: 1.如果两个字段中有一个可以为空,那么还能实现一一对应关系吗?2.除了唯一约束,还有没有其他方法实现一对一关系?3.在MySQL中,如何确保两个字段的一一对应关系在插入和更新时不被破坏? 4.一对一关系在数据库设计中的常见应用场景有哪些?</think>### MySQL 字段一对一关系实现方法 在 MySQL 中实现两个字段的一一对应关系(双射关系),需确保: 1. 每个字段值在自身列中唯一 2. 字段间存在严格的相互唯一映射 #### 实现步骤: 1. **创建结构** 使用 `UNIQUE` 约束确保两个字段各自唯一: ```sql CREATE TABLE entity_table ( id INT PRIMARY KEY AUTO_INCREMENT, field_a VARCHAR(50) NOT NULL UNIQUE, field_b VARCHAR(50) NOT NULL UNIQUE ); ``` 2. **添加联合约束**(可选增强) 防止通过更新操作破坏对应关系: ```sql ALTER TABLE entity_table ADD CONSTRAINT uq_fields UNIQUE (field_a, field_b); ``` 3. **插入数据验证** 插入时会自动校验唯一性约束: ```sql -- 有效插入 INSERT INTO entity_table (field_a, field_b) VALUES ('A1', 'B1'); -- 将因唯一约束失败: INSERT INTO entity_table (field_a, field_b) VALUES ('A1', 'B2'); -- field_a重复 INSERT INTO entity_table (field_a, field_b) VALUES ('A2', 'B1'); -- field_b重复 ``` #### 关键特性: | 约束类型 | 作用说明 | |------------------|----------------------------------| | `UNIQUE (field_a)` | 确保每个 `field_a` 值全局唯一 | | `UNIQUE (field_b)` | 确保每个 `field_b` 值全局唯一 | | `NOT NULL` | 禁止空值破坏对应关系 | #### 应用场景示例 1. **用户系统** `username` 与 `employee_id` 的一一绑定 2. **编码映射** 内部编码与外部编码的严格对应 3. **密钥管理** 公钥与私钥的配对存储 > **注意**:当需要允许 NULL 值时,需使用触发器实现更复杂的校验逻辑,因为 MySQL 的 UNIQUE 约束允许多个 NULL 值共存[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值