Mysql 比较两个表,如果值存在,则显示1,如果值不存在';不存在显示0

Mysql 比较两个表,如果值存在,则显示1,如果值不存在';不存在显示0,mysql,sql,database,Mysql,Sql,Database,SQL架构: CREATE TABLE SNMASTER ( SERIAL_NUMBER varchar(50), WORK_ORDER int(5), ASSY_ID int(3) ); CREATE TABLE TRANSACTIONS ( SERIAL_NUMBER varchar(50), OPERATION_ID int(5), CREATED_ON DATETIME ); INSERT INTO SNMASTER VALUES('0910A40

SQL架构:

CREATE TABLE SNMASTER ( 
  SERIAL_NUMBER varchar(50),
  WORK_ORDER int(5),
  ASSY_ID int(3)
);
  
CREATE TABLE TRANSACTIONS ( 
  SERIAL_NUMBER varchar(50),
  OPERATION_ID int(5),
  CREATED_ON DATETIME
);
  
INSERT INTO SNMASTER VALUES('0910A40877',56794,841);
INSERT INTO SNMASTER VALUES('0910A40886',56794,841);
INSERT INTO SNMASTER VALUES('0910A40895',56794,841);
INSERT INTO SNMASTER VALUES('0910A40902',56794,841);
INSERT INTO SNMASTER VALUES('0910A40911',56794,841);
INSERT INTO SNMASTER VALUES('0910A40920',88545,841);
INSERT INTO SNMASTER VALUES('0910A40939',88545,841);
INSERT INTO SNMASTER VALUES('0910A40948',88545,841);
INSERT INTO SNMASTER VALUES('0910A40957',97846,842);
INSERT INTO SNMASTER VALUES('0910A40966',97846,842);
  
INSERT INTO TRANSACTIONS VALUES('0910A40886',113,'2020-02-27 13:39:46');
INSERT INTO TRANSACTIONS VALUES('0910A40877',116,'2020-02-27 13:39:48');
INSERT INTO TRANSACTIONS VALUES('0910A40886',116,'2020-02-27 13:40:03');
INSERT INTO TRANSACTIONS VALUES('0910A40939',113,'2020-02-27 13:40:20');
INSERT INTO TRANSACTIONS VALUES('0910A40886',160,'2020-02-27 13:40:48');
我需要我的结果显示如下:

SERIAL_NUMBER  113  116  160
 0910A40877    0    1    0
 0910A40886    1    1    1
 0910A40895    0    0    0
 0910A40902    0    0    0
 0910A40911    0    0    0
结果似乎显示了表SNMASTER中的前5行


然后它查看表事务,并在有操作ID时写入1,您可以使用
exists

select sm.*,
       (exists (select 1
                from transactions t
                where t.serial_number = sm.serial_number and t.operation_id = 113
               )
       ) as has_113,
       (exists (select 1
                from transactions t
                where t.serial_number = sm.serial_number and t.operation_id = 116
               )
       ) as has_116,
       (exists (select 1
                from transactions t
                where t.serial_number = sm.serial_number and t.operation_id = 160
               )
       ) as has_160
from snmaster sm;
使用
事务索引(序列号、操作id)
,这可能是最快的方法


在MySQL中,
存在
返回一个布尔值。数据库将
1
视为true,将
0
视为false,这就是为什么这会满足您的要求。在其他数据库中,您需要将
exists
封装在
大小写
表达式中。

这是MySQL语法,而不是SQL Server或Oracle。只使用您真正使用的数据库。考虑应用程序代码中的数据显示问题,这些方法非常接近这些表。我喜欢。非常感谢。我如何将查询限制为只显示MySQL中的前5名?我不知道您是如何识别“top”的。但是您可以使用
orderbylimit 5
。好的,看起来MySQL使用了语法:“limit(number)”。我特别指的是从顶部开始的前5行。再次感谢你。
select a.SERIAL_NUMBER,
sum(case when  b.OPERATION_ID = 113 then 1 else 0 end) as '113',
sum(case when  b.OPERATION_ID = 116 then 1 else 0 end) as '116',
sum(case when  b.OPERATION_ID = 160 then 1 else 0 end) as '160'
from SNMASTER a
left outer join TRANSACTIONS b on (a.SERIAL_NUMBER = b.SERIAL_NUMBER)
group by a.SERIAL_NUMBER