我有两个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中的后处理步骤没有得到很好的优化,但是它们为我做到了这一点。如果我们中有人有更优化的解决方案,请分享。谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!