【问题标题】:Derive another table with data from row values of another table mysql php从另一个表mysql php的行值导出另一个表
【发布时间】:2017-11-03 21:43:28
【问题描述】:

如何将上表转化为下面的结果(php mysql)?

期望的输出

| perf_o | names      | gender | age |
-------------------------------------- 
| 28     |  John Doe  |  male  | 38  |
| 26     |  mary jane | female | 20  |

【问题讨论】:

  • 您是否为自己尝试过而烦恼?这应该是你在学习 php 时首先要学习的东西之一
  • 使用 mysql 和一些 JOINs 你应该可以做到。不需要php。如果您有一些无法运行的 SQL,请返回这里,我们将非常乐意为您提供帮助!
  • 我也无法理解您为什么以这种方式制作数据库。当然,简单地向所述表添加更多字段会更合乎逻辑...
  • @Option 我能够从表中获取数据并且没问题,唯一缺少的是如何使用数据形成另一个更简单的表,正如您所建议的那样。但是,正在处理的表格包含其他人所做的数千条此类信息。
  • @Option 实际上这是一个好方法,只要perf_o 是唯一标识符。假设在使用了一年后,您想添加一个电子邮件字段。使用您的方法,他们必须为表格创建一个新列,使用这种方法,他们所要做的就是插入一个5 , mary jane, email, a@a.a, 26 并繁荣!你拥有了它。它允许更大的灵活性。另一种方法是将数据存储在 JSON 对象或 XML 中。但后来它变成了 NoSQL 数据库和关系数据库之间的混合体,对于某些人来说,它更难管理/理解。

标签: php mysql key-value


【解决方案1】:

这个表格设计是一个有点愚蠢的键/值设置。这是“有点傻”,因为这些设置通常有一个主表和一个详细表,但这里的主表是 denormalized 进入详细表。 denormalization 似乎没有性能原因。

因此,您需要使用子查询来完美地做到这一点。子查询生成主表。

                SELECT DISTINCT names, perf_o FROM tbl

它为输入表中的每个人提供一行。 (这假设每个人都有一个不同的值perf_o;我想这是真的,但你没有这么说。)

然后,您将两次加入到您的详细信息表中,每个 info 值一次。

SELECT master.perf_o, master.names,
       gender.d_prov AS gender,
       age.d_prov AS age
  FROM (
                SELECT DISTINCT names, perf_o FROM tbl
       ) master
  LEFT JOIN tbl gender ON gender.perf_o = master.perf_o AND info = 'gender'
  LEFT JOIN tbl age    ON age.perf_o    = master.perf_o AND info = 'age'

每个LEFT JOIN 操作都会选择您选择的一个键,并将其与master 表相关联。

这看起来很复杂,但对于没有记录此人的年龄或性别的情况,它会做一些合理的事情。

对于刚开始使用 SQL 的人来说,您提出了一个比平常更棘手的问题。请不要只是剪切和粘贴我的答案;而是试着去理解它。

【讨论】:

  • 嗨@O。琼斯,谢谢你的回复和谨慎。假设info 有许多值是/被添加的,正如@Antoniu Livadariu 所指出的那样(在这种情况下,每个人都有12 个不同的info 条目)。正如您的解决方案所建议的那样,我是否必须提及每个人的所有价值?我会小心不要复制粘贴,但有兴趣理解整个概念。比你再一次。
  • 如果info 的不同值的数量很大或值提前未知,您要解决的问题称为透视表。在 MySQL 中,旋转是一个臭名昭著的痛苦。我的建议:不要试图解决 SQL 中的一般情况。而是枚举info 的不同值。它会进行详细查询,但您会更快完成它。 (或者写一个php程序来做。)
  • 感谢您的信息,鉴于正在处理的表格数量,我将尝试编写 php 代码以帮助简化工作,同时,我将直接测试您提出的解决方案。
猜你喜欢
  • 2012-12-05
  • 1970-01-01
  • 2012-06-09
  • 2021-11-05
  • 2016-08-23
  • 2015-05-17
  • 2018-06-11
  • 1970-01-01
  • 2014-08-12
相关资源
最近更新 更多