php—如何操作和整理关联数组中的数据

qjp7pelc  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(340)

我有以下数据数组

2889    1   1062
2889    8   John Smith
2889    6   0.29
2891    1   1117
2891    8   Jamie Dean
2891    6   2
2892    1   1062
2892    8   John Smith
2892    6   4

第一列是与来自网站的表单条目相关的条目id列表,第二列是与表单中的字段相关的meta\u键列表,最后一列是来自这些字段的数据。
我需要做的是整理数组中的数据,以便为我拥有的每个人:

ID Number(Meta_key 1)
Name(Meta_key 8)
Sum(Hours Owed(Meta_key 6))

我不知道如何开始这项任务,任何帮助将非常感谢。
这些数据都是通过以下查询从数据库中提取的:

select 
    entry_id,
    meta_key,
    meta_value
from 
    staff_gf_entry_meta 
where 
    form_id = 48 
and 
    entry_id in (
        select 
            entry_id 
        from 
            staff_gf_entry_meta 
        where 
            meta_key = 7 
        and 
            form_id = 48 
        and 
            meta_value <= '2018-12-18' 
        and 
            meta_value >= '2018-12-12'
    )
and (
    meta_key = 1
    or
    meta_key = 8
    or
    meta_key = 6)

如果需要,可以修改查询。

fnvucqvd

fnvucqvd1#

你可能需要一个 GROUP BYSUM 聚合函数。要获得一行中的所有键/值对,您需要 JOIN 多个查询。

SELECT 
    `mk1`.`meta_value`        `Number`, 
    `mk8`.`meta_value`        `Name`,
    SUM(`mk6`.`meta_value`)   `Hours Owed`
  FROM
    `staff_gf_entry_meta`  `mk1`

  INNER JOIN  
    `staff_gf_entry_meta`  `mk6`
  USING
    (`entry_id`, `form_id`)

  INNER JOIN  
    `staff_gf_entry_meta`  `mk7`
  USING
    (`entry_id`, `form_id`)

  INNER JOIN  
    `staff_gf_entry_meta`  `mk8`
  USING
    (`entry_id`, `form_id`)

  WHERE
    `mk1`.`meta_key` = 1
  AND
    `mk6`.`meta_key` = 6
  AND
    `mk7`.`meta_key` = 7
  AND
    `mk8`.`meta_key` = 8

  AND
    `mk1`.`form_id` = 48
  AND
    `mk7`.`meta_value` BETWEEN '2018-12-12' AND '2018-12-18'

  GROUP BY `mk1`.`meta_value`,`mk1`.`form_id`
;

我假设了下表的结构和数据:

CREATE TABLE `staff_gf_entry_meta`
(
  `form_id` int(11) NOT NULL,
  `entry_id` int(11) NOT NULL,
  `meta_key` int(11) NOT NULL,
  `meta_value` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`entry_id`,`form_id`,`meta_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
;

INSERT INTO `staff_gf_entry_meta` (form_id, entry_id, meta_key, meta_value)
  VALUES
  (48, 2889, 1, 1062),
  (48, 2889, 8, 'John Smith'),
  (48, 2889, 6, 0.29),
  (48, 2891, 1, 1117),
  (48, 2891, 8, 'Jamie Dean'),
  (48, 2891, 6, 2),
  (48, 2892, 1, 1062),
  (48, 2892, 8, 'John Smith'),
  (48, 2892, 6, 4)
;

INSERT INTO `staff_gf_entry_meta` 
  SELECT DISTINCT form_id, entry_id, 7 meta_key, '2018-12-17' meta_value 
  FROM testdb.staff_gf_entry_meta
;

结果:


# Number, Name, Hours Owed

'1062', 'John Smith', '4.29'
'1117', 'Jamie Dean', '2'
6qftjkof

6qftjkof2#

从下面开始,从那里开始构建。

$meta_labels = [
  1 => 'ID'
  8 => 'name'
  6 => 'hours'
];
$output = [];

foreach($results as result) {
  $eid   = $result['entry_id'];
  $label = $meta_labels[$result['meta_key']];

  $output[$eid][$label] = $result['meta_value'];
}

理想情况下,元数据ID与其标签之间的Map应该存储在数据库中,而不是在应用程序中硬编码。

相关问题