【问题标题】:Pivot one table in MySQL在 MySQL 中透视一个表
【发布时间】:2023-03-25 00:34:01
【问题描述】:

我目前遇到了一个问题,我需要将许多行转为一行,由特定的键定义。我知道 GROUP_CONCAT 功能并且目前正在使用它,但我想避免在获取结果后在 PHP 中使用explode。我的桌子是这样的:

----------------------------------
| primary_id | key_value | value |
----------------------------------
| 1          | my_key_1  | val_1 |
| 1          | my_key_2  | val_2 |
| 1          | my_key_3  | val_3 |
| 2          | my_key_4  | val_4 |
| 2          | my_key_5  | val_5 |
----------------------------------

我想构建一个 MySQL 查询,它针对主 ID 1 和主 ID 2 呈现完全一样的内容:

-----------------------------------------------
| primary_id | my_key_1 | my_key_2 | my_key_3 |
-----------------------------------------------
| 1          | val_1    | val_2    | val_3    |
-----------------------------------------------

------------------------------------
| primary_id | my_key_4 | my_key_5 |
------------------------------------
| 2          | val_4    | val_5    |
------------------------------------

所以我可以在 PHP 中将输出作为数组检索,格式如下:

$output[1][my_key_1] = val_1
$output[1][my_key_2] = val_2
...

GROUP_CONCAT 功能有效,但如果只使用 SQL 来获得我需要的形式的值会更好。

不胜感激,最好的问候。

【问题讨论】:

  • 你可以normalize your DB 来避免这类问题。
  • 这是一个 Wordpress 默认表,不能规范化,或者至少不应该规范化。
  • “key_value”列中的值可以是任意值,而不仅仅是一组 3 个不同的值,因此我的问题与该主题有点不同。

标签: php mysql group-by explode concat


【解决方案1】:

使用枢轴

select max(case (当 key_value=my_key_1 然后 val_1 结束)), 最大(案例(当 key_value=my_key_2 然后 val_2 结束)), 从... 等等……

【讨论】:

  • 这是一个可能的解决方案,但我必须静态列出我想避免的每个字段。
  • 您是否有一种 SQL 之上的查询对象语言(如 hql、jpql)可以用来创建 key_value 对象?我用hibernate做了这样的事情,第一个请求key_value列表并将这个列表作为第二个请求的参数传递给pivot。导致没有静态引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多