【问题标题】:INNER JOIN MULTIPLE COLUMN WITH ONE TABLE MYSQL用一张表 MYSQL 内连接多列
【发布时间】:2018-01-09 14:28:54
【问题描述】:

我有 2 个不同的表,一个包含类别 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 

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

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

我可以做些什么来获得我的结果还是应该改变我的桌子? 谢谢

【问题讨论】:

  • 有多少个cat 列?您需要加入每个列,并且必须命名您想要的列,而不仅仅是select *

标签: mysql database inner-join


【解决方案1】:
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 并添加一个外键。

A many to many tutorial 可以在此处找到,它可以让您更好地了解如何更好地构建表格。

【讨论】:

    【解决方案2】:

    您应该规范化您的表 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
    

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

      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 
    

    【讨论】:

    • 谢谢,通过翻转解决方案,我设法获得了我的看法。我也会考虑重组表格!
    • @SimoneMarini 好吧,如果我的回答至少有用,您可以正确评价它..(靠近 asnwer 的箭头)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2011-10-18
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2021-09-16
    • 2012-12-11
    相关资源
    最近更新 更多