[英]Merge two tables in MySQL
我有两个要在一个查询中合并在一起的mysql表。 最好用一个例子来描述:
table: users
| user_id | username |
| 1 | jason |
| 2 | justin |
table: user_data
| user_id | key | data |
| 1 | email | jason@email.com |
| 1 | phone | 555-123-4567 |
| 2 | email | justin@email.com|
| 2 | phone | 555-765-4321 |
query results:
| user_id | username | email | phone |
| 1 | jason | jason@email.com | 555-123-4567 |
| 2 | justin | justin@email.com | 555-765-4321 |
您可以假设所有用户之间的键非常统一(即所有用户都有电子邮件和电话)。 我首先想到的是做这样的事情,但我很好奇是否有更好的方法:
SELECT *,e.data as email,p.data as phone FROM users u
LEFT JOIN user_data AS e ON e.user_id=u.user_id AND `key`='email'
LEFT JOIN user_data AS p ON p.user_id=u.user_id AND `key`='phone';
所有用户都有电子邮件和电话
那么为什么不在原始表中为其添加列呢?
table: users
| user_id | username | email | phone |
| 1 | jason | .... | .... |
| 2 | justin | .... | .... |
这将使查询变得更加轻松和快捷。
您使用的设计称为实体属性值 (EAV),通常在有许多属性但填充稀疏的情况下很有用。
假设您无法或不想更改表设计,那么我对查询所做的唯一更改就是不使用SELECT *
。 明确列出列。
我同意@Mark Bayers。
但是,如果您坚持自己的设计,则应考虑以下问题:一个用户是否可能有多个电子邮件? 或一个以上的电话? 如果真是这样,那么您将获得每个用户的电话和电子邮件的所有组合。
如果您只想为每个用户排一行,并在相应字段中包含所有数据,则可以尝试以下操作:
SELECT users.id, users.username
, GROUP_CONCAT(IF(user_data.key = 'email', user_data.data, NULL)) emails
, GROUP_CONCAT(IF(user_data.key = 'phone', user_data.data, NULL)) phones
FROM users
INNER JOIN user_data
ON users.id = user_data.user_id
GROUP BY users.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.