Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当一个字段是ID数组时,连接两个表_Mysql_Sql - Fatal编程技术网

Mysql 当一个字段是ID数组时,连接两个表

Mysql 当一个字段是ID数组时,连接两个表,mysql,sql,Mysql,Sql,我有两张桌子: 雇员 Name | DepartmentId | Address | Phone number -------------------------------------------- Tom | [a1, b2] | 51 Rue Fort | 123456 Ron | [a1] | San Picafort | 234566 Matt | [b2] | Frank Road | 523422 Id | Name | Address | Pho

我有两张桌子:

雇员

Name | DepartmentId | Address | Phone number
--------------------------------------------
Tom  | [a1, b2] | 51 Rue Fort  | 123456
Ron  | [a1]    | San Picafort | 234566
Matt | [b2]    | Frank Road   | 523422 
Id | Name | Address     | Phone number
-----------------------------------
1 | Tom  | 51 Rue Fort  | 123456
2 | Ron  | San Picafort | 234566
3 | Matt | Frank Road   | 523422 

Id | Dept Name | Number of Employees | Location 
------------------------------------------
a1  | HR | 500 | Zambia
b2  | IT | 300 | Tanzania
Id | DeptName | Number of Employees | Location 
-----------------------------------------------
a1  | HR      | 500                 | Zambia
b2  | IT      | 300                 | Tanzania
Emp | Dept 
-----------
1  | a1
1  | b2
2  | a1 
3  | b2
我需要在DepartmentId上连接两个表,但问题是EMPLOYEE表中的DepartmentId是一个数组。我不能在这上面跑。比如:

select *
from EMPLOYEE,
     DEPARTMENT
where EMPLOYEE.DepartmentId = DEPARTMENT.id;
这将产生如下输出:

Name | DepartmentId | Address | Phone number | Dept Name | Number of Employees | Location 
---------------------------------------------------------------------
Tom | a1 | 51 Rue Fort | 123456 | HR | 500 | Zambia
Tom | b2 | 51 Rue Fort | 123456 | IT | 300 | Tanzania
Ron | a1 | San Picafort | 234566 | HR | 500 | Zambia
Matt | b2 | Frank Road | 523422 | IT | 300 | Tanzania

如何使用查询使EMPLOYEE表原子化,然后运行联接查询?

使用LIKE运算符创建内部联接

SELECT E.NAME,
E.DepartmentId,
E.Address,
E.[Phone number],
D.[Dept Name],
D.[Number of Employees],
D.Location 
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D
    ON CAST(E.DepartmentId AS VARCHER(MAX)) LIKE '%' + CAST(D.id AS VARCHER(MAX))+ '%'

使用LIKE运算符创建内部联接

SELECT E.NAME,
E.DepartmentId,
E.Address,
E.[Phone number],
D.[Dept Name],
D.[Number of Employees],
D.Location 
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D
    ON CAST(E.DepartmentId AS VARCHER(MAX)) LIKE '%' + CAST(D.id AS VARCHER(MAX))+ '%'

数组很难处理,我不确定@mkRabbani是否有像
这样的更快的解决方案,但另一种可能更适合的方法是使用join。两者都非常低效,但查询如下所示:

SELECT *
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D
    ON FIND_IN_SET(D.Id, E.DepartmentId)

数组很难处理,我不确定@mkRabbani是否有像
这样的更快的解决方案,但另一种可能更适合的方法是使用join。两者都非常低效,但查询如下所示:

SELECT *
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D
    ON FIND_IN_SET(D.Id, E.DepartmentId)

我认为更简洁的方法可能是使用一个额外的表来表示
员工
部门
之间的多对多关系。比如说
员工\部门
。雇主和部门之间的每种关系都有一行。当然,您也可以向employee表中添加ID。我认为所有的查询都会有所不同,但会有更好的性能

表格如下所示:

雇员

Name | DepartmentId | Address | Phone number
--------------------------------------------
Tom  | [a1, b2] | 51 Rue Fort  | 123456
Ron  | [a1]    | San Picafort | 234566
Matt | [b2]    | Frank Road   | 523422 
Id | Name | Address     | Phone number
-----------------------------------
1 | Tom  | 51 Rue Fort  | 123456
2 | Ron  | San Picafort | 234566
3 | Matt | Frank Road   | 523422 

Id | Dept Name | Number of Employees | Location 
------------------------------------------
a1  | HR | 500 | Zambia
b2  | IT | 300 | Tanzania
Id | DeptName | Number of Employees | Location 
-----------------------------------------------
a1  | HR      | 500                 | Zambia
b2  | IT      | 300                 | Tanzania
Emp | Dept 
-----------
1  | a1
1  | b2
2  | a1 
3  | b2
员工服务部

Id | Dept Name | Number of Employees | Location 
------------------------------------------
a1  | HR | 500 | Zambia
b2  | IT | 300 | Tanzania
Id | DeptName | Number of Employees | Location 
-----------------------------------------------
a1  | HR      | 500                 | Zambia
b2  | IT      | 300                 | Tanzania
Emp | Dept 
-----------
1  | a1
1  | b2
2  | a1 
3  | b2
您询问的问题可能是:

Select E.*, D.Id from EMPLOYEE as E left join EMPLOYEE_DEPARTMENT as ED on E.Id=ED.Emp left join DEPARTMENT as D on ED.Dept=D.Id;
生产产量:

Id | Name | Address     | Phone number | Dept Name | Number of Employees | Location | DepartmentId  
---------------------------------------------------------------------------------------------------
1  | Tom   | 51 Rue Fort | 123456       | HR        | 500                 | Zambia   | a1  
1  | Tom   | 51 Rue Fort | 123456       | IT        | 300                 | Tanzania | b2 
2  | Ron   | San Picafort| 234566       | HR        | 500                 | Zambia   | a1
3  | Matt  | Frank Road  | 523422       | IT        | 300                 | Tanzania | b2

另外,在输出上,您可以使用
部门
表的其他列更改
部门ID

我认为更简洁的方法可能是使用一个额外的表来表示
员工
部门
之间的多对多关系。比如说
员工\部门
。雇主和部门之间的每种关系都有一行。当然,您也可以向employee表中添加ID。我认为所有的查询都会有所不同,但会有更好的性能

表格如下所示:

雇员

Name | DepartmentId | Address | Phone number
--------------------------------------------
Tom  | [a1, b2] | 51 Rue Fort  | 123456
Ron  | [a1]    | San Picafort | 234566
Matt | [b2]    | Frank Road   | 523422 
Id | Name | Address     | Phone number
-----------------------------------
1 | Tom  | 51 Rue Fort  | 123456
2 | Ron  | San Picafort | 234566
3 | Matt | Frank Road   | 523422 

Id | Dept Name | Number of Employees | Location 
------------------------------------------
a1  | HR | 500 | Zambia
b2  | IT | 300 | Tanzania
Id | DeptName | Number of Employees | Location 
-----------------------------------------------
a1  | HR      | 500                 | Zambia
b2  | IT      | 300                 | Tanzania
Emp | Dept 
-----------
1  | a1
1  | b2
2  | a1 
3  | b2
员工服务部

Id | Dept Name | Number of Employees | Location 
------------------------------------------
a1  | HR | 500 | Zambia
b2  | IT | 300 | Tanzania
Id | DeptName | Number of Employees | Location 
-----------------------------------------------
a1  | HR      | 500                 | Zambia
b2  | IT      | 300                 | Tanzania
Emp | Dept 
-----------
1  | a1
1  | b2
2  | a1 
3  | b2
您询问的问题可能是:

Select E.*, D.Id from EMPLOYEE as E left join EMPLOYEE_DEPARTMENT as ED on E.Id=ED.Emp left join DEPARTMENT as D on ED.Dept=D.Id;
生产产量:

Id | Name | Address     | Phone number | Dept Name | Number of Employees | Location | DepartmentId  
---------------------------------------------------------------------------------------------------
1  | Tom   | 51 Rue Fort | 123456       | HR        | 500                 | Zambia   | a1  
1  | Tom   | 51 Rue Fort | 123456       | IT        | 300                 | Tanzania | b2 
2  | Ron   | San Picafort| 234566       | HR        | 500                 | Zambia   | a1
3  | Matt  | Frank Road  | 523422       | IT        | 300                 | Tanzania | b2

此外,在输出上,您可以使用
部门
表的其他列更改
部门ID

永远不要将数据存储为逗号分隔的项目。您的DepartmentId列只会给您带来很多麻烦。我从NOSQL数据库中获得了这样的数据,我无能为力。那里的数据没有标准化。MySQL不支持数组。您有一个字符串,格式为JSON数组。这不是一回事。您应该使用连接表,而不是格式化为字符串的ID。你应该努力修复数据模型。永远不要将数据存储为逗号分隔的项。您的DepartmentId列只会给您带来很多麻烦。我从NOSQL数据库中获得了这样的数据,我无能为力。那里的数据没有标准化。MySQL不支持数组。您有一个字符串,格式为JSON数组。这不是一回事。您应该使用连接表,而不是格式化为字符串的ID。您应该努力修复数据模型。语法错误:第4:31行:“+”不能应用于varchar(1),varchar列E.DepartmentId和D.id的数据类型是什么?@Bharthan-我在这两列中都添加了强制转换。现在应该可以了。给出语法错误:第4:31行:“+”不能应用于varchar(1),varchar列E.DepartmentId和D.id的数据类型是什么?@Bharthan-我在这两列中都添加了强制转换。现在应该可以了。