MySQL查询指定用户未出现在另一表的serialNumber实现方法
MySQL 多表差集查询方案
首先明确两张表的核心关联字段(根据业务逻辑推导):
infoequipo表:存储用户和对应设备序列号,核心字段为emailCliente(用户唯一标识)、serialNumber(设备序列号)habitacion表:存储已录入的设备序列号,核心关联字段为serialNumber
以下是三种可用的SQL写法,可根据实际场景选择:
方案1:LEFT JOIN 左连接筛选(最推荐,性能稳定)
SELECT ie.serialNumber FROM infoequipo ie LEFT JOIN habitacion h ON ie.serialNumber = h.serialNumber WHERE ie.emailCliente = '1' -- 替换为实际要查询的emailCliente值 AND h.serialNumber IS NULL;
逻辑说明:通过左连接匹配两张表的序列号,当habitacion表中没有对应匹配记录时,关联字段会返回NULL,筛选该条件即可得到目标结果。
方案2:NOT IN 子查询(逻辑最直观)
SELECT serialNumber FROM infoequipo WHERE emailCliente = '1' AND serialNumber NOT IN ( SELECT serialNumber FROM habitacion WHERE serialNumber IS NOT NULL );
注意事项:子查询中必须加serialNumber IS NOT NULL条件,避免habitacion表的serialNumber存在空值时,整体查询结果为空的问题。
方案3:NOT EXISTS 子查询(大数据量场景性能优异)
SELECT ie.serialNumber FROM infoequipo ie WHERE ie.emailCliente = '1' AND NOT EXISTS ( SELECT 1 FROM habitacion h WHERE h.serialNumber = ie.serialNumber );
优化提示:如果两个表的
serialNumber字段都建立了索引,以上三种写法的查询效率都会有明显提升。
内容的提问来源于stack exchange,提问作者Felipe Clemente
相关产品推荐
相关产品推荐

