【问题标题】:SQL to list tables a's associated data from table bSQL从表b列出表a的关联数据
【发布时间】:2018-10-01 22:24:19
【问题描述】:

给定具有电话号码(表格:电话)的人员(表格:联系人),

如何编写 SQL 查询(Sqlite3、postgres 或 MySQL)来显示每个人及其所有电话号码?

 Table: contacts      Table: Phones
 id  name             id  phone_number    contact_id
 1   Ashok            1   (111) 123-1111  1
 2   Betty            2   (111) 123-2222  1
 3   Charles          3   (111) 123-3333  1
                      4   (111) 123-4444  1
                      5   (222) 456-1111  2
                      6   (222) 456-2222  2
                      7   (333) 789-1111  3
                      8   (333) 789-2222  3
                      9   (333) 789-3333  3

我希望输出是:

Name    Phones
Ashok   (111) 123-1111 (111) 123-2222 (111) 123-3333 (111) 123-4444
Betty   (222) 456-1111 (222) 456-2222 
Charles (333) 789-1111 (333) 789-2222 (333) 789-3333

如果我加入:

SELECT      c.name, p.phone_number
FROM        contacts as c
INNER JOIN  phones as p
ON          c.id = p.contact_id
ORDER BY    c.name

结果不是我想要的:

Name    Phone
Ashok   (111) 123-1111
Ashok   (111) 123-2222
Ashok   (111) 123-3333
Ashok   (111) 123-4444
Betty   (222) 456-1111
Betty   (222) 456-2222
Charles (333) 789-1111
Charles (333) 789-2222
Charles (333) 789-3333

【问题讨论】:

    标签: mysql sql postgresql sqlite


    【解决方案1】:

    MySQLSQLite 都有GROUP_CONCAT() 函数:

    SELECT c.name, GROUP_CONCAT(p.phone_number) AS Phones
    FROM contacts AS c
    INNER JOIN phones AS p ON c.id = p.contact_id
    GROUP BY c.name
    ORDER BY c.name;
    

    PostgreSQL中你可以使用array_to_string()array_agg()函数:

    SELECT c.name, array_to_string(array_agg(p.phone_number), ',') AS Phones
    FROM contacts AS c
    INNER JOIN phones AS p ON c.id = p.contact_id
    GROUP BY c.name
    ORDER BY c.name;
    

    由于PostgreSQL 9.0 你可以直接使用string_agg()

    SELECT c.name, string_agg(p.phone_number, ',') AS Phones
    FROM contacts AS c
    INNER JOIN phones AS p ON c.id = p.contact_id
    GROUP BY c.name
    ORDER BY c.name;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2016-03-17
    • 2018-06-20
    • 2022-11-18
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多