mysql - 合并MySQL中的两个表

标签 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 |

您可以假设所有用户的 key 都非常统一(即所有用户都有电子邮件和电话)。我的第一个想法是做这样的事情,但我很好奇是否有更好的方法:

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';

最佳答案

all users have an email and phone

那为什么不在原始表中为它们添加列呢?

table: users
| user_id | username | email | phone  |
| 1       | jason    | ....  | ....   |
| 2       | justin   | ....  | ....   |

这将使查询变得更加容易和快捷。

您使用的设计名为 Entity-attribute-value (EAV),当属性很多但分布稀疏时通常很有用。

假设您不能或不想更改表设计,我对您的查询所做的唯一更改就是不使用 SELECT *。明确列出列。

关于mysql - 合并MySQL中的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358567/

相关文章:

mysql - 使用 counterCache 保存多行

PHP MySQL 绑定(bind)变量问题 >1 条件

mysql - 如何将这两个查询合并在一起?

php - 如果已分配给 orderno,则选择不显示的查询

php - 如何在不连接数据库的情况下运行PHP应用程序

PHP MySQL 查询 "Create Table"- 初学者需要帮助

mysql - SQL SELECT 一个具有更多值的虚拟列

mysql - 如果结果子集不包含所需日期,如何过滤掉它?

mysql - 基于 GROUP BY 中的单个列使用 DISTINCT

php - 如果记录存在则添加到记录,否则创建记录