Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从mysql数据库中选择多表(在单个字段中返回多个项目)_Mysql_Sql_Database - Fatal编程技术网

从mysql数据库中选择多表(在单个字段中返回多个项目)

从mysql数据库中选择多表(在单个字段中返回多个项目),mysql,sql,database,Mysql,Sql,Database,我需要一些认真的帮助。事情是这样的。。。 假设我有一个带有字段(userId,name)的“users”表。现在,我需要从与该用户相关的其他表中获取多个信息项。有些项目类似,因此需要捆绑在一起 现在我还有几个其他表格: CREATE TABLE app.phones ( `id` INT NOT NULL AUTO_INCREMENT , `userId` INT NOT NULL , `phone` VARCHAR( 16 ) NOT NULL , PRIMARY KEY ( `id` ) )

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

现在我还有几个其他表格:

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\u methods
包含引用这些表的条目。

请尝试此项以确定大小

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):


这并不能回答问题。他希望每个姓名有一行电话、电子邮件和群组列表。谢谢你这么做,但除了Chris的便笺外,你的查询不使用表contact_方法。+1回答了问题@查德,正如克里斯所说,你的问题没有具体说明如何使用
联系方法
@Chad;您希望如何显示联系人方法?对不起,你们都是对的,我没有。我想做的是,不是直接从phones and emails表中获取用户的电子邮件和电话,而是首先从contact_methods表中获取用户的条目。因此,在我的示例中,假设John Doe在contact_methods表中有四个条目。两个用于电子邮件,两个用于电话。
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