从mysql数据库中选择多表(在单个字段中返回多个项目)
我需要一些认真的帮助。事情是这样的。。。 假设我有一个带有字段(userId,name)的“users”表。现在,我需要从与该用户相关的其他表中获取多个信息项。有些项目类似,因此需要捆绑在一起 现在我还有几个其他表格:从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` ) )
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