将一个转换为多个转换为行

时间:2017-11-07 21:58:07

标签: mysql database

我有以下表结构:

用户

| id | name 
|----|------
| 1  | Pete 
| 2  | Jeff
| 3  | Bob

属性

| user_id | key    | value
|---------|--------|------
| 1       | Age    | 24
| 1       | Gender | M
| 1       | City   | New York
| 2       | Age    | 26
| 2       | Gender | M
| 3       | Age    | 30
| 3       | Eyes   | Blue

现在我需要将这些值“分组”到(mysql)表中,以便稍后我可以过滤/排序/ ...

预期结果

| Name | Age | Gender  | City     | Eyes
|------|-----|---------|----------|-------
| Pete | 24  | M       | New York |
| Jeff | 26  | M       |          |
| Bob  | 30  |         |          | Blue

以这种方式存储它的原因是每个用户都可以定义它的“自己的”属性。

目前我在代码中创建/过滤/排序此表,但是我想知道是否可以使用mysql完成 - 使用mysql过滤/排序这个最后一个表确实非常方便。

但请注意,行数非常大(数十万到数百万)。

我的具体问题如下:

  • mysql是否有任何工具可以简化这些任务? (也许是临时表?大型数据集的表现如何)
  • 是否有其他数据库使这些操作更加简单(像弹性搜索这样的NoSql类型?)

我正在寻找解决此类数据“分组”的一般提示/建议,指南或可能的替代方案。

1 个答案:

答案 0 :(得分:0)

我不知道你正在尝试的东西存在的工具,但我可以肯定地为你提供一个可以帮助你的以下查询。

SELECT 
  u.name as 'Name', 
  j1.value as 'Age',
  j2.value as 'Gender'
  j3.value as 'City'
  j4.value as 'Eyes'
FROM
  Users u 
  LEFT JOIN Properties j1 ON (u.id = j1.user_id AND j1.key = 'Age')
  LEFT JOIN Properties j2 ON (u.id = j2.user_id AND j2.key = 'Gender')
  LEFT JOIN Properties j3 ON (u.id = j3.user_id AND j3.key = 'City')
  LEFT JOIN Properties j4 ON (u.id = j4.user_id AND j4.key = 'Eyes')
ORDER BY u.id;