我有2个表设置如下所示,我需要使用什么MySQL查询来返回每个条目的关联数组及其相关字段?我尝试了各种JOIN,但它们都返回第二个表中每个项目的结果。最终,我希望第一个表中的每个项目都有一个包含一个子数组的父数组。每个子数组都包含表A中的名称以及表B中属于它的所有字段,其中B.entryID = A.ID。
A
ID |Name |Created
1 Jeff 2013-20-12
2 Bob 2011-23-14
B
ID |Value |FieldID |entryID
1 U.S 1 1
2 91725 2 1
3 China 1 2
期望的结构
Array
(
[0] => Array
(
[0] => Jeff
[1] => U.S
[2] => 91420
)
[1] => Array
(
[0] => Bob
[1] => China
[2] =>
)
)
答案 0 :(得分:0)
SELECT A.Name, B.Value from A LEFT JOIN B on A.ID=B.entryID
答案 1 :(得分:0)
好的,有几种方法可以做到这一点......
如果你取出数组位并且更适当地处理你的数据,那么正确的方法是:
SELECT `A`.`ID`, `A`.`Name`, `B`.`Value`
FROM A
INNER JOIN
`B` ON `A`.`ID` = `B`.`entryID`
ORDER BY `A`.`ID`, `B`.`Value`
这将返回如下结果:
array(
0 => array(ID=>1, Name=>'Jeff', Value=>'U.S'),
1 => array(ID=>1, Name=>'Jeff', Value=>'91725'),
2 => array(ID=>2, Name=>'Bob', Value=>'China')
)
你会像这样迭代(你可以修改它来创建你所追求的数组结构,而不是回显一个字符串......):
$mysqli = new mysqli(...);//Make your db connection
$query = $mysqli->query("
SELECT `A`.`ID`, `A`.`Name`, `B`.`Value`
FROM A
INNER JOIN
`B` ON `A`.`ID` = `B`.`entryID`
ORDER BY `A`.`ID`, `B`.`Value`
");
$newArr = array();
$lastID = '';
if($query->num_rows){
while($row = $query->fetch_assoc()){
if($lastID == $row['ID']){
end($newArr);
$key = key($newArr);
$newArr[$key][] = $row['Value'];
}
else{
$newArr[] = array($row['Name'], $row['Value']);
}
$lastID = $row['ID'];
}
}
var_export($newArr);
/**
Output:
array (
0 =>
array (
0 => 'Jeff',
1 => 'U.S.',
2 => '91275',
),
1 =>
array (
0 => 'Bob',
1 => 'China',
),
)
*/
如果确实希望/需要从SQL query
输出数组,那么我建议如下:
SELECT
A.ID, A.Name,
CONCAT(
'[',
GROUP_CONCAT('"', B.Value, '"'),
']'
) as Values
FROM A
INNER JOIN B ON B.entryID = A.ID
GROUP BY A.ID
哪会将Values
输出为json
:
array(
0=>arryay(ID=>1, Name=> 'Jeff', Values='["U.S.", "91725"]'),
1=>arryay(ID=>1, Name=> 'Bob', Values='["China"]')
)
每次访问json_decode
中的记录时,您需要在Values
上运行php
。类似的东西:
$mysqli = new mysqli(...);//Make your db connection
$query = $mysqli->query("
SELECT
A.ID, A.Name,
CONCAT(
'[',
GROUP_CONCAT('"', B.Value, '"'),
']'
) as Values
FROM A
INNER JOIN B ON B.entryID = A.ID
GROUP BY A.ID
");
$newArr = array();
if($query->num_rows){
while($row = $query->fetch_assoc()){
$newArr[] = array($row['Name']);
end($newArr);
$key = key($newArr);
$fieldData = json_decode($row['Values']);
foreach($fieldData as $value){
$newArr[$key][] = $value;
}
}
}
var_export($newArr);
/**
Output:
array (
0 =>
array (
0 => 'Jeff',
1 => 'U.S.',
2 => '91275',
),
1 =>
array (
0 => 'Bob',
1 => 'China',
),
)
*/
注意:我建议您不要这样做...因为如果您的数据没有以可以允许的方式存储,它可能会导致各种错误(例如,如果您没有编码/转义"
)。如果从B
...