【问题标题】:multi-table SELECT from mysql database (return multiple items in single field)从 mysql 数据库中选择多表(在单个字段中返回多个项目)
【发布时间】:2011-05-13 05:07:57
【问题描述】:

我需要一些认真的帮助。事情是这样的... 假设我有一个带有字段(userId,name)的“用户”表。现在我需要从与该用户相关的其他表中获取多项信息。有些物品相似,所以需要捆绑在一起。

现在我还有其他几个表:

CREATE TABLE app.phones (
`id` INT NOT NULL AUTO_INCREMENT ,
`userId` INT NOT NULL ,
`phone` VARCHAR( 16 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

CREATE TABLE app.emails (
`id` INT NOT NULL AUTO_INCREMENT ,
`userId` INT NOT NULL ,
`email` VARCHAR( 32 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

CREATE TABLE app.contact_methods (
`id` INT NOT NULL AUTO_INCREMENT ,
`userId` INT NOT NULL ,
`method` ENUM( 'phone', 'email' ) NOT NULL,
`methodId` INT NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

CREATE TABLE app.groups (
`id` INT NOT NULL AUTO_INCREMENT ,
`groupName` VARCHAR( 16 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

CREATE TABLE app.users_groups (
`id` INT NOT NULL AUTO_INCREMENT ,
`userId` INT NOT NULL ,
`groupId` INT NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

您可能已经猜到,每个用户都可以拥有多封电子邮件、多部电话并属于多个群组。如何使用上面的所有表格显示如下表格?

+---------+-------------+-------------------+--------------+
|name     |phones       |emails             |groups        |
+---------+-------------+-------------------+--------------+
|John Doe |123-555-0101,|johndoe@mail.com,  |group1,group2,|
|         |123-555-0909 |johndoe2@mail.com  |group3        |
+---------+-------------+---------+---------+--------------+

更新:电子邮件和电话不应立即从他们的桌子上拿走。表 contact_methods 包含引用这些表的条目。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    试试这个尺寸

    SELECT u.name, ph.phone, em.email, gr.groupName 
    FROM users AS u, phones AS ph, emails AS em, groups AS gr 
    WHERE (u.id = ph.userId) 
        AND (u.id = em.userId) 
        AND (u.id = gr.userId) 
    GROUP BY u.id
    

    或者将值连接起来得到一行(感谢@chris-morgan):

    SELECT u.name, 
        GROUP_CONCAT(ph.phone SEPARATOR ','), 
        GROUP_CONCAT(em.email SEPARATOR ','), 
        GROUP_CONCAT(gr.groupName SEPARATOR ',') 
    FROM users AS u, phones AS ph, emails AS em, groups AS gr 
    WHERE (u.id = ph.userId) 
        AND (u.id = em.userId) 
        AND (u.id = gr.userId) 
    GROUP BY u.id
    

    【讨论】:

    • 这没有回答所提出的问题。他希望每个姓名有一行,并带有串联的电话、电子邮件和群组列表。
    • 感谢您,但除了 Chris 的注释之外,您的查询不使用表 contact_methods。
    • +1 回答了问题。 @Chad,你的问题没有具体说明如何使用contact_methods
    • @Chad,正如克里斯所说;你想如何显示contact_methods
    • 对不起,你说的都是对的,我没有。我想做的是,我不想直接从电话和电子邮件表中获取用户的电子邮件和电话,而是首先从contact_methods 表中获取用户的条目。因此,在我的示例中,假设 John Doe 在 contact_methods 表中有四个条目。两个用于电子邮件,两个用于电话。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多