首页 > 解决方案 > 如何操作和整理关联数组中的数据

问题描述

我有以下数据数组

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 列表,第二列是与表单中的字段相关的元键列表,最后一列是来自这些字段的数据。

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

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)

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

标签: phpmysqlarrays

解决方案


您可能需要一个带有聚合函数的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'

推荐阅读