【问题标题】:export mysql table with data spread over multiple rows to csv将数据分布在多行的mysql表导出到csv
【发布时间】:2015-12-09 15:42:19
【问题描述】:

我有一个 mysql 表,其中填充了来自我网站上的网络表单的输入。该表单具有姓氏、姓氏、电子邮件、电话、地址等字段。当用户提交表单时,这些数据以一种相当奇怪的方式存储在 mysql 表中。 我的桌子是这样的:

subission# | value                | field   | tstamp    | and   |many |more |columns
=====================================================================================
1          |john@server.com       |email    |1448898875 |       |     |     |
1          |john                  |firstname|1448898875 |       |     |     |
1          |doe                   |lastname |1448898875 |       |     |     |
1          |london                |city     |1448898875 |       |     |     |
2          |jane@aol.com          |email    |1448898870 |       |     |     |
2          |jane                  |firstname|1448898870 |       |     |     |
2          |doe                   |lastname |1448898870 |       |     |     |
2          |new york              |city     |1448898870 |       |     |     |
3          |tim @aol.com          |email    |1448838571 |       |     |     |
3          |tim                   |firstname|1448838571 |       |     |     |
3          |smith                 |lastname |1448838571 |       |     |     |
3          |paris                 |city     |1448838571 |       |     |     |

我需要将这些数据导出到 csv 文件,以便将其导入到其他服务器上的时事通讯脚本中,但服务器希望这些数据采用不同的格式:

submission#,email,firstname,lastname,tstamp,.....
1,john@server.com,john,doe,london,1448898875,,,,
2,jane@aol.com,jane,doe,1448898870,,,,

导出为csv不是问题,但是如何将一个提交#的所有数据都放在一行中?谁能指出我正确的方向,如何用 SQL 完成这个?

【问题讨论】:

  • 如果我是你,我会使用字段值作为列而不是值。现在,您必须在要合并的所有行中至少有一个相同的值。我会说使用timestamp 不是很节省,因为如果添加两个用户添加相同的时间戳会发生什么?
  • 我认为subission 列可以达到这个目的,不幸的是,您必须将每个字段的表连接到自身一次才能使用 MySQL 获得所有结果。然后只需select ... into outfile...

标签: mysql csv export


【解决方案1】:

如果使用 concat() 和 group_concat() 函数将字段内容连接到单个字段中,则可以实现所需的输出,其中值用逗号分隔。

唯一的问题可能是对于特定提交,是否缺少任何属性。如果是这种情况,那么您将需要一个列出所有属性的辅助表,并且您需要在该表上左连接。由于您的示例数据不是这种情况,因此我不提供此方案的代码。

select concat(submission, ',', group_concat(`value` order by `field` asc), ',',tstamp)
from table group by submission, tstamp

如果您需要第一行中的字段名称,则创建一个单独的查询,将用逗号分隔的字段名称连接起来,并将 2 与 union 结合起来。

【讨论】:

  • 非常感谢,这就像一个魅力。你刚刚拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2016-01-25
  • 2014-10-20
相关资源
最近更新 更多