【问题标题】:Join three tables in mySQL?在 mySQL 中加入三个表?
【发布时间】:2012-02-09 19:12:40
【问题描述】:

我有三个这样的表:

人物

id | name   | location
-----------------------
 1 | ABC    | Location1
 2 | XYZ    | Location2

联系方式

id | type    | contact
---------------------------
 1 | website | abc.com
 2 | email   | abc@abc.com
 3 | website | xyz.com
 4 | email   | xyz@xyz.com

联系人

Person_id | Contact_id
-----------------------
    1     |    1
    1     |    2
    2     |    3
    2     |    4

我想得到这样的结果:

id | name | website | email
----------------------------------
 1 | ABC  | abc.com | abc@abc.com
 2 | XYZ  | xyz.com | xyz@xyz.com 

【问题讨论】:

  • 尝试过什么?什么有效?什么没有?
  • 你试过什么?这真的很容易做到。如果我直接给你答案,我会很难过。
  • mysql - query three tables 的可能重复项
  • 我不确定这是否像你们所说的那样明显。他基本上想将行转换为列。

标签: php mysql join


【解决方案1】:

有几种方法可以做到这一点,但这里是 MySQL 的简单方法

SELECT
   p.id,
   p.name,
   MAX(IF(c.type = 'website', c.contact, NULL)) AS 'website',
   MAX(IF(c.type = 'email', c.contact, NULL)) AS 'email'
FROM
   Person p INNER JOIN
   PersonContact pc ON p.id = pc.Person_ID INNER JOIN
   Contact c ON pc.contact_id = c.id
GROUP BY p.id

【讨论】:

    【解决方案2】:

    有趣的是,如果不使用 if 语句,查询会有多复杂。它实际上是每列一个左连接!干得好@Ben!

    select p.id, p.name, max(website) as website, max(email) as email from person p
    join personContact pc on p.id = pc.person_id
    join contact c on pc.contact_id = c.id
    left join (
      select c.id as cid, c.contact as website from personContact pc
      join contact c on pc.contact_id = c.id
      where c.type = 'website'
    ) as WebsiteCol
    on c.id = WebsiteCol.cid
    left join (
      select c.id as cid, c.contact as email from personContact pc
      join contact c on pc.contact_id = c.id
      where c.type = 'email'
    ) as EmailCol
    on c.id = EmailCol.cid
    group by p.id, p.name
    

    【讨论】:

      【解决方案3】:
      SELECT p.id, p.name, c.contact FROM Person p, PersonContact pc , Contact c WHERE p.id = pc.Person_id AND pc.Contact_id= c.id 
      

      【讨论】:

      • 没有给出 OP 要求的结果
      猜你喜欢
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2014-06-29
      • 1970-01-01
      • 2018-03-14
      • 2016-02-04
      相关资源
      最近更新 更多