当前位置: 首页 > 面试题库 >

如何选择所有在mysql中找不到输入数组的数据

卫念
2023-03-14
问题内容

CREATE TABLE emp (
empno decimal(4,0) NOT NULL,
ename varchar(10) default NULL,
job varchar(9) default NULL,
mgr decimal(4,0) default NULL,
hiredate date default NULL,
sal decimal(7,2) default NULL,
comm decimal(7,2) default NULL,
deptno decimal(2,0) default NULL
);

INSERT INTO emp VALUES ('7369','SMITH','CLERK','7902','1980-12-17','800.00',NULL,'20');
INSERT INTO emp VALUES ('7499','ALLEN','SALESMAN','7698','1981-02-20','1600.00','300.00','30');
INSERT INTO emp VALUES ('7521','WARD','SALESMAN','7698','1981-02-22','1250.00','500.00','30');
INSERT INTO emp VALUES ('7566','JONES','MANAGER','7839','1981-04-02','2975.00',NULL,'20');
INSERT INTO emp VALUES ('7654','MARTIN','SALESMAN','7698','1981-09-28','1250.00','1400.00','30');
INSERT INTO emp VALUES ('7698','BLAKE','MANAGER','7839','1981-05-01','2850.00',NULL,'30');
INSERT INTO emp VALUES ('7782','CLARK','MANAGER','7839','1981-06-09','2450.00',NULL,'10');
INSERT INTO emp VALUES ('7788','SCOTT','ANALYST','7566','1982-12-09','3000.00',NULL,'20');
INSERT INTO emp VALUES ('7839','KING','PRESIDENT',NULL,'1981-11-17','5000.00',NULL,'10');






empno   ename    job       mgr         hiredate   sak        comm  depno   
'7369', 'SMITH', 'CLERK',   '7902', '1980-12-17', '800.00', NULL, '20'
'7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30'
'7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30'
'7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975.00', NULL, '20'
'7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250.00', '1400.00', '30'
'7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850.00', NULL, '30'
'7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450.00', NULL, '10'
'7788', 'SCOTT', 'ANALYST', '7566', '1982-12-09', '3000.00', NULL, '20'
'7839', 'KING', 'PRESIDENT', NULL, '1981-11-17', '5000.00', NULL, '10'

这是我想要的桌子

选择表中找到的数据,但找不到要使用连接或联合的两个数据,我正在尝试使用此查询,但无法执行。

SELECT * FROM (emp)
WHERE  FIND_IN_SET(ename, 'SMITH,WARD,KING,TOM')

Union All
select  * from (emp)  where  !FIND_IN_SET(ename, 'SMITH,WARD,KING,TOM')

我想要输入“ SMITH,WARD,KING,TOM”时

那么它应该像这样重新运行数据:

empno   ename    job       mgr         hiredate   sak        comm  depno  
'7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800.00', NULL, '20'
'7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30'
'7839', 'KING', 'PRESIDENT', NULL, '1981-11-17', '5000.00', NULL, '10'
null   , 'TOM' , null               ,null,      null             null           null, null

请建议我如何实现

我想以这种方式创建“过程”,以便我将传递“ SMITH,ALLEN,TOM”,然后应该以这种方式给3行7369 | SMITH,7499 |
ALLEN,null | TOM


问题答案:

辅助表用于左联接/右联接概念,但并不是那么简单。

从我的答案在这里(Edit3)在这里:

CREATE TABLE 4kTable
(   -- a helper table of about 4k consecutive ints
    id int auto_increment primary key,
    thing int null
)engine=MyISAM;

insert 4kTable (thing) values (null),(null),(null),(null),(null),(null),(null),(null),(null);
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
insert 4kTable (thing) select thing from 4kTable;
-- verify:
-- select min(id),max(id),count(*) from 4kTable;
-- 1 4608 4608

ALTER TABLE 4kTable ENGINE = InnoDB; -- *********** it is now InnoDB

从用户fthiella的修改后的答案中
…此处发布

select SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ',', 4k.id), ',', -1) name 
from 
  4kTable 4k  
  cross join (select @str:='SMITH,WARD,KING,TOM') vars 
  on CHAR_LENGTH(@str) 
     -CHAR_LENGTH(REPLACE(@str, ',', ''))>=4k.id-1; 
+-------+
| name  |
+-------+
| SMITH |
| WARD  |
| KING  |
| TOM   |
+-------+

因此,以上是将csv放入查询并从中生成表的一般形式。

现在d,根据上述内容创建一个派生表(),并通过RIGHT JOIN与操作码结合(该模式已在操作码中显示)

select d.name as rtable_name,e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno 
from emp e 
right join 
(   select SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ',', 4k.id), ',', -1) name  
    from 4kTable 4k  
    cross join (select @str:='SMITH,WARD,KING,TOM') vars 
    on CHAR_LENGTH(@str) 
        -CHAR_LENGTH(REPLACE(@str, ',', ''))>=4k.id-1 
) d 
on d.name=e.ename;

结果:

+-------------+-------+-------+-----------+------+------------+---------+--------+--------+
| rtable_name | empno | ename | job       | mgr  | hiredate   | sal     | comm   | deptno |
+-------------+-------+-------+-----------+------+------------+---------+--------+--------+
| SMITH       |  7369 | SMITH | CLERK     | 7902 | 1980-12-17 |  800.00 |   NULL |     20 |
| WARD        |  7521 | WARD  | SALESMAN  | 7698 | 1981-02-22 | 1250.00 | 500.00 |     30 |
| KING        |  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 |   NULL |     10 |
| TOM         |  NULL | NULL  | NULL      | NULL | NULL       |    NULL |   NULL |   NULL |
+-------------+-------+-------+-----------+------+------------+---------+--------+--------+


 类似资料:
  • 问题内容: 好的,通常我知道如果知道数组值(在这种情况下为1,2,3),您将执行以下操作: 但是我不知道数组的值,我只知道我要查找的值是“存储”在数组中的: 这不起作用。还有另一种方法吗? 问题答案: 使用FIND_IN_SET函数:

  • 问题内容: 我有一个包含大量数据的数据库。我想选择所有数据,但是按一列分组。 因此,例如: 在示例列中,A是具有重复值且需要分组的列。但是B列具有不同的值,我想选择所有这些值。 最后,我想得到一个查询,导致: B列的值在jQuery手风琴中。 我已经尝试并搜索了几个小时,但仍然没有找到一种方法来进行此操作。 编辑: 我已经设法使用戈登提供的答案解决问题。使用PHP,我分解了查询结果,并通过whil

  • 问题内容: 我想知道php中是否有一个函数可以让我将所有选择的数据放在一个数组中。当前我正在使用mysql_fetch_array,并且正如我在手册中所读的那样,该函数不会获取表中的每条记录。 问题答案: 我建议出于性能和安全目的使用MySQLi或MySQL PDO,但要回答这个问题: 如果您切换到MySQLi,则可以执行以下操作:

  • 问题内容: 我试图建立一个适当的反应输入复选框,选择所有组件。想法是有一个组件,并且我可以检查,所有组件也都将被选中。 我有两个问题。 如果选中,则无法取消选择任何一个。 如果已全部选中,则应进行检查。 这是例子。 问题答案: 我认为可能会对您的实现进行一些修改,以便以更具 React风格的 形式获得所需的结果。 首先要取消的是复选框类和该类的prop 。复选框是一个相对愚蠢的元素,它不应该了解诸

  • 问题内容: 我有以下数据: 如何在Postgres中编写SQL语句以选择此数据为多维数组,即: 我以前在Postgres中已经见过这种数组的用法,但是不知道如何从表中选择数据到这种数组格式。 假设这里所有列都是。 问题答案: 您不能用于生成多维数组,至少不能用于或更高版本。 (但是即将发布的Postgres 9.5附带了该罐的新变体!) 您从@Matt Ball的查询中得到的是一个记录数组()。

  • 我使用jQuery Datatables插件来显示数据。它提供分页、搜索、排序等功能,所以每次我只在当前页面上显示10条记录。如果我点击next或page number(由Bootstrap Datatable提供),将显示另外10条记录。正如问题中提到的,我想从所有页面中选择所有复选框。