内部使用一个表连接多个列

y0u0uwnf  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(281)

我有两个不同的表,一个带有类别id和名称,另一个带有我的员工信息。员工可以拥有更多类别。
表格示例:
类别表:

IDCAT | Name
----------
 1 | Mechanic
 2 ! Office
 3 | Generic Mechanic

员工表:

ID | Name              | cat1 | cat2 | cat3
--------------------------------------------
 1 | Mechanic          |  1   |   2  |
 2 ! Office            |  1   |   3  |   
 3 | Generic Mechanic  |  1   |   2  |   3

我想用mysql打印这样的表,这样我就可以在php脚本中打印它:

ID | Name              | cat1        | cat2                | cat3
--------------------------------------------------------------------------------
 1 | Mechanic          |  Mechanic   |  Office             |
 2 ! Office            |  Mechanic   |   Generic Mechanic  |   
 3 | Generic Mechanic  |  Mechanic   |  Office             |   Generic Mechanic

我尝试了这个查询,但我只打印第一个类别名称

SELECT * FROM 'Employee' INNER JOIN category on Employee.cat1 = category.idcat

我能做些什么来得到我的结果吗?或者我应该换张table吗?谢谢

vfhzx4xs

vfhzx4xs1#

您应该规范化表employee,避免在类别中使用多个列,例如:

Category table:

IDCAT | Name
----------
 1 | Mechanic
 2 ! Office
 3 | Generic Mechanic
Employee table:

ID | Name              
----------------------
 1 | Emp1 Mechanic     
 2 ! Office            
 3 | Generic Mechanic 

Employee_category
id | id_emp | id_cat
-------------------------
1  ! 1      | 1
2  | 1      | 2
3  | 2      | 1
4  | 2      | 3
5  ! 3      | 1
6  | 3      | 2
7  | 3      ! 3

基于此模式,您可以使用groupconcat在一行中获取与员工相关的所有类别

select e.name, group_concat(c.name)
  from employee e
  inner join Employee_category ec on e.id = ec.id_emp
  inner join Caetgory c on c.idcat = ec.id_cat
  group by e.name
fgw7neuy

fgw7neuy2#

SELECT
    e.ID
    ,e.Name
    ,c1.Name
    ,c2.Name
    ,c3.Name
FROM
    Employee AS e
    LEFT JOIN Category as c1 ON e.cat1 = c1.ID
    LEFT JOIN Category AS c2 ON e.cat2 = c2.ID
    LEFT JOIN Category AS c3 ON e.cat3 = c3.ID

请注意,employee表的结构很差。通常,您会有一个单独的表来保存employeeid+categoryid并添加外键。
在这里可以找到一个多对多的教程,它可以让您更好地了解如何更好地构造表。

相关问题