【问题标题】:INNER or LEFT Joining Multiple Table Records Into A Single RowINNER 或 LEFT 将多个表记录连接到单行
【发布时间】:2011-02-03 18:40:54
【问题描述】:

电话桌

+----------------+--------------+ |领域 |类型 | +----------------+--------------+ | f_id |整数(15) | | f_client_id |整数(11) | | f_phone_type | varchar(50) | | f_phone_number | varchar(13) | +----------------+--------------+

客户表

+-----------------+--------------+---- --+-----+ |领域 |类型 |空 |钥匙 | +-----------------+--------------+---- --+-----+ | f_id |整数(15) |否 |优先级 | | f_first_name | varchar(13) |是 |穆尔 | | f_mi |字符(1) |是 | | | f_last_name | varchar(20) |否 |穆尔 | +------------------+--------------+---- --+-----+

假设:

  1. “电话表”中的每条记录都属于“客户表”中的一条记录。
  2. “客户表”中的每条记录在“电话表”中可以有 0 条或多条记录。
  3. 简单翻译:一个客户可以有 0 个或多个电话号码

使用标准的 LEFT 或 INNER 连接,我会得到这样的结果:

+------------+------------+--------------+ |姓名 |电话类型 |电话号码 | +------------+------------+--------------+ |约翰·史密斯 |主页 | 712-555-6987 | |约翰·史密斯 |工作 | 712-555-1236 | +------------+------------+--------------+

我需要一个查询,它可以为我提供属于给定客户的工作和家庭电话号码:

+------------+----------------+--------------+ |姓名 |工号 |家庭号码 | +------------+----------------+--------------+ |约翰·史密斯 | 712-555-1236 | 712-555-6987 | +------------+----------------+--------------+

是否可以进行 LEFT 或 INNER 连接,然后将这些结果合并到一行中?我见过类似的问题,但给出的例子比我所追求的要复杂得多:

类似问题

谢谢

【问题讨论】:

    标签: mysql left-join inner-join


    【解决方案1】:

    虽然您可以将多个数字(任意)连接到一个字段中:

    SELECT
      CONCAT(f_first_name, ' ', f_last_name) as Client_Name,
      GROUP_CONCAT(IF(phone_type='work',f_phone_number, NULL)) as Work_Numbers,
      GROUP_CONCAT(IF(phone_type='home',f_phone_number, NULL)) as Home_Numbers
    FROM clients
    JOIN phone
      USING (f_id)
    WHERE phone_type IN ('home', 'work')
    GROUP BY f_id;
    

    【讨论】:

    【解决方案2】:

    特定客户记录可以拥有多少个工作或家庭号码是否有限制?如果它可以是很多,那么不,没有办法做一个单行。如果每个最多有 1 个,那么您可以在电话号码表中加入两次。

    【讨论】:

      【解决方案3】:
      SELECT CONCAT(c.f_first_name, ' ', c.f_last_name) as Client_Name, 
             wp.f_phone_number as Work_Number,
             hp.f_phone_number as Home_Number
      
        FROM clients c
             LEFT OUTER JOIN phone hp
             ON hp.f_client_id = c.f_id
          AND
             hp.phone_type = 'home'
             LEFT OUTER JOIN phone wp
             ON wp.f_client_id = c.f_id
          AND
             wp.phone_type = 'work'
      

      使用 LEFT OUTER JOIN,您仍会为缺少数字的客户获取行。如果您不想看到这些,请更改为 INNER JOIN。

      编辑:正如尼克提醒我的那样,这将为具有多个电话号码的客户返回多行。获得所需数据后,您将面临演示问题。你可以在应用层处理,或者祭祀 SQL 之神,看看 MySQL 的 GROUP_CONCAT() 函数。

      【讨论】:

      • 这并不能优雅地处理可能有多个工作或家庭号码的情况。
      • 客户不能拥有多个工作或家庭号码。好的,从技术上讲他们可以(数据库不限制它),但是输入这些数据的程序会限制它。谢谢你们的回答。 @adam,我会试一试,让你知道它是否有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多