【问题标题】:Mysql Query INNER JOINMysql查询INNER JOIN
【发布时间】:2016-10-18 22:56:29
【问题描述】:

我有以下 2 个表:

领导

LEADID pmp 下午 ci_lead av_lead prod_lead f_lead sec_l​​ead PID

团队成员

用户标识符 名称 名字 电子邮件 d_phone h_phone

Lead 表中的所有数据都是 int(),对应于 TeamMember 表中的 UID。

所以我想做的是,假设我使用 PID 作为键从 Lead 表中选择一行,我想从 TeamMembers 中提取与 Lead 表中的 id 匹配的所有 fname 和 lname。我试过 INNER Joins 来完成这个,但似乎总是只输出第一个 id。

这是我尝试过的最新查询

SELECT `TeamMember`.`fname`,
       `TeamMember`.`lname`
  FROM `MaxusDash`.`Lead`
 INNER JOIN `MaxusDash`.`TeamMember`
    ON (`Lead`.`pmp` = `TeamMember`.`UID`)
   AND (`Lead`.`pms` = `TeamMember`.`UID`)
   AND (`Lead`.`ci_lead` = `TeamMember`.`UID`)
   AND (`Lead`.`av_lead` = `TeamMember`.`UID`)
   AND (`Lead`.`prod_lead` = `TeamMember`.`UID`)
   AND (`Lead`.`f_lead` = `TeamMember`.`UID`)
   AND (`Lead`.`sec_lead` = `TeamMember`.`UID`)
 WHERE `Lead`.`pid` = 44;

感谢您的帮助。

【问题讨论】:

  • 您当前的查询表明所有这些 id 都必须指向每一行中的同一个用户。你可能想改用OR,但你可能会得到重复,并且必须处理它。
  • Of-topic 但在看到上面的代码后,您似乎会从轻微的表格重新设计或添加中受益

标签: mysql


【解决方案1】:

如果您想返回单行中的所有名称,则需要对每个外键关系使用单独的连接操作。

但您似乎想在单独的行中返回每个名称。

一种方法是这样的:

 SELECT r.role
      , m.fname
      , m.lname
   FROM `MaxusDash`.`Lead` l
  CROSS
   JOIN (           SELECT 'pmp' AS `role`
          UNION ALL SELECT 'pms'
          UNION ALL SELECT 'ci_lead'
          UNION ALL SELECT 'av_lead'
          UNION ALL SELECT 'prod_lead'
          UNION ALL SELECT 'f_lead'
          UNION ALL SELECT 'sec_lead'
        ) r
   LEFT     
   JOIN `MaxusDash`.`TeamMember` m
     ON ( m.uid = l.pmp       AND r.role = 'pmp'       )
     OR ( m.uid = l.pms       AND r.role = 'pms'       )
     OR ( m.uid = l.ci_lead   AND r.role = 'ci_lead'   )
     OR ( m.uid = l.av_lead   AND r.role = 'av_lead'   )
     OR ( m.uid = l.prod_lead AND r.role = 'prod_lead' )
     OR ( m.uid = l.f_lead    AND r.role = 'f_lead'    )
     OR ( m.uid = l.sec_lead  AND r.role = 'sec_lead'  )

  WHERE l.pid = 44

根据role 列的字符集和您的连接,您可能需要指定(覆盖默认值)字符串文字的字符集。例如,如果 rolelatin1,并且您的连接是 UTF8,为了避免“非法混合排序规则”错误,您可以在字符串文字前加上 _latin1

                    SELECT _latin1'pmp' AS `role`
          UNION ALL SELECT _latin1'pms'

如果我们不需要返回的值,请从 SELECT 列表中删除 r.role 表达式。删除 LEFT 关键字以使用内连接而不是外连接。

【讨论】:

    【解决方案2】:

    您已使用UNION 或为每个主要成员创建JOIN

    联合:

    SELECT `pmp` as lead, `TeamMember`.`fname`, `TeamMember`.`lname`
    FROM `MaxusDash`.`Lead`
    INNER JOIN `MaxusDash`.`TeamMember` 
            ON (`Lead`.`pmp` = `TeamMember`.`UID`) 
    WHERE `Lead`.`pid`=44
    UNION  
    SELECT `pms` as lead, `TeamMember`.`fname`, `TeamMember`.`lname`
    FROM `MaxusDash`.`Lead`
    INNER JOIN `MaxusDash`.`TeamMember` 
            ON (`Lead`.`pms` = `TeamMember`.`UID`) 
    WHERE `Lead`.`pid`=44
    UNION  
    ....
    UNION
    SELECT `sec_lead` as lead, `TeamMember`.`fname`, `TeamMember`.`lname`
    FROM `MaxusDash`.`Lead`
    INNER JOIN `MaxusDash`.`TeamMember` 
            ON (`Lead`.`sec_lead` = `TeamMember`.`UID`) 
    WHERE `Lead`.`pid`=44
    

    加入

    SELECT `pmp`.`fname`, `pmp`.`lname`,
           `psp`.`fname`, `psp`.`lname`,
           ....
           `sec_lead`.`fname`, `sec_lead`.`lname`
    FROM `MaxusDash`.`Lead` as `L`
    INNER JOIN `MaxusDash`.`TeamMember` as `pmp`
            ON L.`pmp` = `pmp`.`UID`
    
    INNER JOIN `MaxusDash`.`TeamMember` as `psp`
            ON L.`psp` = `psp`.`UID`
    
    ....
    INNER JOIN `MaxusDash`.`TeamMember` as `sec_lead`
            ON L.`sec_lead` = `sec_lead`.`UID`
    
    WHERE `L`.`pid`=44
    

    【讨论】:

    • UNION 解决方案也可以,但是不断需要插入 pid= 不适合我的应用程序。也感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多