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

时间:2018-12-13 21:24:16

标签: php mysql arrays

我有以下数据数组

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_key列表,最后一列是来自这些字段的数据。

我需要做的是整理数组中的数据,以便每个人都有:

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)

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

2 个答案:

答案 0 :(得分:2)

您可能需要带有GROUP BY聚合函数的SUM语句。要连续获取所有键/值对,您需要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'

答案 1 :(得分:1)

从下面类似的内容开始,然后从那里开始构建。

$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及其标签之间的映射应该存储在数据库中,而不是在应用程序中进行硬编码。