【问题标题】:Selecting multiple rows of data from a subtable along with the parent row table in MySQL从子表中选择多行数据以及MySQL中的父行表
【发布时间】:2012-09-30 12:02:27
【问题描述】:

我的数据库中有两个表,大致如下所示

客户

id |  other data
1  |  data 1
2  |  data 2
3  |  data 3
4  |  data 4

分配的员工

id  | clientid | employee
1   | 1        | Fred
2   | 1        | Jim
3   | 3        | Peter
4   | 4        | Fred
5   | 4        | Peter
6   | 4        | James

有没有办法从员工表中返回包含所有员工记录的客户表?理想情况下,我想要行的 id 和员工姓名,所以我认为我不能使用 GROUP_CONCAT 来收集多于一列。也不能保证员工表中的每个客户总是有一个条目,因此它需要为这些客户返回空/空结果。

到目前为止,我已经尝试了两种在 php 中实现这一点的方法,但无论哪种方式都非常低效。

(A) 第一个是在第一个连接的中途有效地建立一个新的数据库连接,以返回与该客户端 ID 关联的员工列表,但显然这会导致仅针对一个查询建立大量数据库连接.

(B) 第二个是在代码开头将整个员工表拉入一个数组,并在该数组中搜索以提取与该客户 ID 相关的行,然后将员工姓名和行 ID 放入其中。随着时间的推移,这将导致一个相当大的数组立即转储到 php 中。

有没有办法只使用一个 SQL 查询来解决这个问题?我并没有那么在意数据是如何出来的,因为我确信我可以在另一端的 php 中对其进行排序,但可能类似于

结果

id |  other data | employees
1  |  data 1     | 1,Fred;2,Jim
2  |  data 2     | 
3  |  data 3     | 3,Peter
4  |  data 4     | 4,Fred;5,Peter;6,James

如果之前有人问过这个问题,我深表歉意,但上周我一直在搜索,但没有找到太多帮助。

【问题讨论】:

    标签: mysql sql group-concat


    【解决方案1】:
    SELECT e.*, c.other_data FROM Employee e
    INNER JOIN Client c ON e.client_id = c.id
    

    因此,您最终得到的是在一个查询中获取的两个表中的所有信息。因此,数据将是:

         id        client_id    Employee    other_data
         1             1          Fred        data 1
         2             1          Jim         data 1
         3             3          Peter       data 3
         4             4          Fred        data 4
         5             4          Peter       data 4
         6             4          James       data 4
    

    【讨论】:

    • 谢谢,但这不会返回 client_id = 2 行的空行。
    • 那是因为列出的员工都没有使用客户端 #2 :)。如果您想了解有关特定客户端的信息,只需添加 WHERE 子句。喜欢添加: WHERE e.client_id =2 将为您提供专属客户 #2 的员工列表。
    • @bms,是的,你是对的。这是正确的答案,因为 OP 接受了它。很抱歉。
    • 因此,如果不使用其他查询,我是否必须将此列表与完整的客户列表进行比较,以查看其中哪些没有分配给他们的员工?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多