通过php将mysql组concat字符串转换为json对象结构

nszi6y05  于 2021-06-19  发布在  Mysql
关注(0)|答案(0)|浏览(260)

我有两个mysql表,第一个是父表,第二个是子表。这两个表共享1:m关系。这个 T_1 包含具有某些信息的唯一用户列表。以及 T_2 包含每个用户在特定时间戳处的坐标的所有行数据列表。子表 T_2 有一个引用 T_1 父表。我分享下面的create语句:

CREATE TABLE `T_1` (
  `id` varchar(45) DEFAULT NULL,
  `value_1` tinyint(4) NOT NULL,
  `personId` varchar(45) NOT NULL,
  `value_2` varchar(45) NOT NULL,
  `value_3` varchar(45) NOT NULL,
  `Value_4` int(11) NOT NULL,
  PRIMARY KEY (`personId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `T_2` (
  `personId` varchar(45) NOT NULL,
  `timestamp` varchar(45) NOT NULL,
  `x` int(11) NOT NULL,
  `y` int(11) NOT NULL,
  KEY `user_fk_idx` (`personId`),
  CONSTRAINT `user_fk` FOREIGN KEY (`personId`) REFERENCES `T_1` (`personId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我想得到这样的最终json结果:

[
    {
        "id": "",
        "value_1": true,
        "personId": "1",
        "value_2": "test",
        "value_3": "test",
        "value_4": 10,
        "lineData": [
            {
                "timestamp": "some_date",
                "x": 100,
                "y": 250
            },
            {
                "timestamp": "some_date",
                "x": 100,
                "y": 350
            }
        ]
    },
    {
        "id": "",
        "value_1": true,
        "personId": "2",
        "value_2": "test",
        "value_3": "test",
        "value_4": 10,
        "lineData": [
            {
                "timestamp": "some_date",
                "x": 50,
                "y": 450
            },
            {
                "timestamp": "some_date",
                "x": 80,
                "y": 550
            }
        ]
    }
]

这是我为获得所有 T_2 每个的记录 T_1.personId :

SELECT T_1.personId,GROUP_CONCAT(CONCAT(T_2.timestamp, T_2.x, T_2.y) SEPARATOR ' ') 
FROM T_1 
JOIN T_2
ON T_1.personId=T_2.personId 
GROUP  BY personId;

除了我还需要补充 id , value_1 , value_2 , value_3 , value_4 ,查询聚合似乎是正确的,因为我离预期结果还很远:

通过使用 PDO::FETCH_ASSOC 在php中查询fetch实际上得到了类似的预期数组结果。
但主要的问题是,linedata聚合只是以单个字符串格式分组并串联在一起,而不是以对象结构形式(屏幕下方)

我附上以下来自查询选择的示例数据:

array(7) {
    ["id"]=>
    NULL
    ["value_1"]=>
    string(1) "0"
    ["personId"]=>
    string(2) "1"
    ["value_2"]=>
    string(9) "test"
    ["value_3"]=>
    string(4) "test"
    ["value_4"]=>
    string(2) "10"
    ["linedata"]=>
    string(359) "2018/09/15 10:00:05 AM1100950 2018/09/15 10:00:07 AM1100850 2018/09/15 10:00:09 AM1180800 2018/09/15 10:00:10 AM1280800 2018/09/15 10:00:15 AM1380800 2018/09/15 10:00:17 AM1480800 2018/09/15 10:00:20 AM1900800 2018/09/15 10:00:25 AM1930750 2018/09/15 10:00:40 AM1910440 2018/09/15 10:00:45 AM1250460 2018/09/15 10:01:25 AM1100455 2018/09/15 10:01:29 AM1100655"
  }
}

可能需要在选择查询中连接方括号和方括号吗?
有人能告诉我如何得到正确的线性数据分离结构吗?我想我们还需要使用一些后处理php的东西,以便获得所需的输出结构。

更新

根据@salman a的建议,我对查询进行了如下调整:

GROUP_CONCAT(CONCAT_WS(', ',timestamp,x, y) SEPARATOR '; ') as linedata_0

我已经将查询结果存储在 $query_result . 然后我做了一个嵌套的foreach,以便用 ; 每行的每一个值 ,$query_result['linedata_0'] . 我把爆炸的结果放进了一个叫做 linedata_1 . 如下图所示:

foreach ($query_result as $q_r){
        $first_split = explode(";", $q_r["linedata_0"]);
        foreach ($first_split as $f_s){
            $second_split =   explode(",", $f_s);          
            $query_result["linedata_1"][]= $second_split;         
        }       
  }

我已经移除了 $query_result[0]["linedata_0"] 元素。在这之后,我给每个 $query_result['linedata_1'] 子数组并存储在名为 $query_result['linedata'] . 之后我就把旧的 $query_result['linedata_1'] 具有的元素 unset 我在最后一刻 x 以及 y 从字符串到整数的值:

unset($query_result[0]["linedata_0"]);

foreach(($query_result["linedata_1"]) as $q_r) {

    $keys = array('timestamp', 'x', 'y');

    $query_result["linedata"][] = array_combine($keys, $q_r);
}

unset($query_result["linedata_1"]);

$index = 0;
foreach($query_result["linedata"] as $index=>$val) {

    $query_result["linedata"][$index]["x"] = (int) $val["x"];
    $query_result["linedata"][$index]["y"] = (int) $val["y"];

    $index++;
}

通过这些php后处理操作,我得到了预期的结果。可能php中的后处理步骤没有得到很好的优化,但是它们为我做到了这一点。如果我们中有人有更优化的解决方案,请分享。谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题