将多个表中的数据合并到具有多个值的数组中

问题描述 投票:0回答:2

在以下示例中,记录数据以网格形式加载到客户端。

表 my_cars

id   car_name
1      Ford
2      BMW

桌车_详情

id_detail  id_car  country  car_detail
 1           1       USA        red
 2           1       USA        blue
 3           2       GER        green

如果用户选择一行,记录数据将以更新形式加载。

客户端必须以 JSON 格式接收数据,格式如下:

第一条记录

    car_name : "Ford"  

    my_cars: Array(2)
    0: {id_detail: "1", country: "USA", car_detail: "red"}
    1: {id_detail: "2", country: "USA", car_detail: "blue"}

第二条记录

    car_name : "BMW"      

    my_cars: Array()
    0: {id_detail: "1", country: "GER", car_detail: "green"}

我正在努力以所需的格式获取 my_cars 数组值。

如果我只需要从 cars_detail 表中获取数据,我会执行以下正确工作的方法:

$query = "SELECT id_detail, country, car_detail
          FROM cars_detail";

    $statement = $conexion->query($query);

    while($row = $statement->fetch_assoc()) {
        $my_cars[] = array(
              'id_car'=> $row['id_car'],
              'country'=> $row['country'],
              'car_detail'=> $row['car_detail']
            );
    };

但是我需要从两个表中获取每条记录的数据。

在我的一次尝试中,我尝试在查询中使用 GROUP_CONCAT,然后以某种方式使用explode 创建正确的数组。

$query = "SELECT mc.car_name
      GROUP_CONCAT(DISTINCT CONCAT( 'id_detail', ':', cd.id_detail,  'country', ':', cd.country, 'car_detail', ':', cd.car_detail)  SEPARATOR ',')  AS all_detail_values,
      FROM my_cars mc          
      LEFT JOIN cars_detail cd ON mc.id_car = cd.id_car
      LIMIT ?,?";

if ($statement = $conexion->prepare($query)){

  $statement->bind_param("ii", $start, $limit);
  $statement->execute();

  statement->bind_result($car_name, $all_detail_values);

    while($statement->fetch()){

       //This solution does not work correctly
        $values = explode(",", $all_detail_values);
         foreach($values as $value){
            list($key,$val) = explode(" : ", $value);
            $my_cars[][$key] = $val;
         }


        $output[] = array(
            'car_name'=>$car_name,
            'my_cars'=>$my_cars
        );
    };


echo json_encode(array(
    "records_values" => $output
);

解决此类案件的最佳方法是什么?

已编辑

抱歉,如果我没有以最好的方式解释这一点。这是 http://sqlfiddle.com/#!9/456203/11

my_cars 必须采用数组格式

php mysql
2个回答
0
投票

我不明白为什么你需要

GROUP_CONCAT
它。简单地列出列有什么问题吗?

SELECT mc.car_name, cd.id_detail, cd.country, cd.car_detail
FROM my_cars mc          
LEFT JOIN cars_detail cd ON mc.id_car = cd.id_car
LIMIT ?,?

0
投票

我知道这是一个老问题,您可能很久以前就解决了这个问题,但也许还有其他人正在寻找一种组装查询结果的方法。为了能够组装它,有必要选择主键。 cars_detail 表的实体将添加到相应的 my_cars 表实体中。为了组装结果,我们使用了结构“my_cars.cars_detail*(my_cars)”。我们使用字符 * 来表示对于每个 my_cars 类型的实体,我们有多个 cars_detail 类型的实体。

https://github.com/updatablejs/ujb

$result = $database->prepare(
    'SELECT * FROM my_cars
        LEFT JOIN cars_detail ON my_cars.id = cars_detail.id_car'
    )
->setAssembler([
    'structure' => 'my_cars.cars_detail*(my_cars)',
])

->execute();

print_r($result->fetchAll());

Array
(
    [0] => Array
        (
            [id] => 1
            [car_name] => Ford
            [my_cars] => Array
                (
                    [0] => Array
                        (
                            [id_detail] => 1
                            [id_car] => 1
                            [country] => USA
                            [car_detail] => red
                        )

                    [1] => Array
                        (
                            [id_detail] => 2
                            [id_car] => 1
                            [country] => USA
                            [car_detail] => blue
                        )
                )
        )

    [0] => Array
        (
            [id] => 2
            [car_name] => BMW
            [my_cars] => Array
                (
                    [0] => Array
                        (
                            [id_detail] => 3
                            [id_car] => 2
                            [country] => GER
                            [car_detail] => green
                        )
                )
        )
)
© www.soinside.com 2019 - 2024. All rights reserved.