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-我在这两列中都添加了强制转换。现在应该可以了。