Объединить данные из нескольких таблиц в массив с несколькими значениями

0

В следующем примере данные записи загружаются на стороне клиента в сетке.

table my_cars

id   car_name
1      Ford
2      BMW

стол cars_detail

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 Array в нужном формате.

Если мне просто нужно было получить данные из таблицы 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 должен быть в формате массива

  • 0
    Почему вы используете GROUP_CONCAT если вам нужен массив с одной строкой по результату? Просто сделайте SELECT cd.id_detail, cd.country, cd.car_detail FROM cars_detail as cd INNER JOIN my_cars as mc ON mc.id = cd.id_car AND mc.car_name = /* the car name */ , нет? Не забудьте использовать подготовить запрос и связать параметр, чтобы избежать внедрения SQL, но с этим запросом вы не получите желаемое значение?
  • 0
    @MickaelLeger спасибо. Записи имеют данные из нескольких таблиц. В этом примере я должен отправить данные клиенту из двух таблиц, из одной из которых есть многозначные значения. Мне нужен массив car_name и my_cars в одной записи. Серверная сетка загружает все записи.
Показать ещё 4 комментария
Теги:

1 ответ

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
    Спасибо, Эрик. Я отредактировал свой вопрос с помощью sqlfiddel. Моя проблема в том, что на стороне клиента my_cars должен быть получен в каждой записи в формате массива, равного Первой записи и Второй записи (в моем вопросе)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню