php - 如何使用 PHP 转换规范化数据集?

标签 php mysql pivot normalization

这是我的表格:

用户表

id   |   name  
1    |   john  
2    |   lucy  

用户帐户表

id   |   user_id    |   account_name
1          2             lucy_lu
2          1             johndoe

account_parameters 表

id   |  account_id  |  parameter_id   |  value
1           1              10             4000
2           1              11             1450
3           2              10             5000
4           2              11             1150

参数表

id   |   parameter_value  |  parameter_name
10          height               Height
11          max_score            Max Score

我要得到结果:

user_id | user_name | account_name |  Height  |  Max Score
1          john        johndoe        5000       1150
2          lucy        lucy_lu        4000       1450

我搜索了“mysql generate columns with data”和类似的东西,找到了许多针对 1 或 2 个表的解决方案,但我不知道如何在此处实现这些解决方案。我知道如何选择带连接的静态字段,但我不知道如何在这个例子中选择“高度”和“最高分”。

最佳答案

如果您必须使用 SQL 执行此操作,那么使用编写 SQL 的 PHP 似乎是耦合度最低的方法。

首先,查询您的参数表并将其存储在一个数组中。

然后分三部分构建查询字符串,中间部分是动态创建的。

SELECT
    user_accounts.user_id          AS user_id,
    user.name                      AS user_name,
    user_accounts.account_name     AS account_name,


对数组中的每条记录重复此操作(来自参数)

    SUM(
        CASE WHEN account_parameters.parameter_id = @param_id
             THEN account_parameters.value
        END
    )   AS @param_name,

使用 PHP 替换@param_id 和@param_name 值。

(注意逗号,您不希望在 SQL 的最后一行出现逗号。)


FROM
    account_parameters
INNER JOIN
    user_accounts
        ON  user_accounts.id = account_parameters.account_id
INNER JOIN
    user
        ON  user.id = user_accounts.user_id
GROUP BY
    user_accounts.user_id,
    user.name,
    user_accounts.account_name

注意:在 MySQL 中,您只需要GROUP BY user_accounts.user_id,但我不建议ab在一般。


执行该动态构建的查询应该为您调整结果。

您可能需要一些上下文敏感性来确定您想要和不想包含在最终结果中的参数(使用这种结构,您似乎并不总是需要所有参数)

关于php - 如何使用 PHP 转换规范化数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32399662/

相关文章:

php - 在 Codeigniter 中编写此查询

php - MySQL 中的 If 或 CASE 语句

python - Pandas :转向真/假,删除列

SQL。如何从一列中获取值并将其传递给另一列

php - 直接获取 MongoDB\Driver\Cursor 对象到指定类中

php - 在 FirstData GGE4 上集成定期付款的最佳方式是什么?

php - 通过 SQL 检索库存中所有没有图像的 WooCommerce 产品

php - 为什么我的表格中只显示一个结果?

php - move_uploaded_file() 在我的情况下不起作用

mysql - 如何创建额外的列使用列值?