В следующем примере данные записи загружаются на стороне клиента в сетке.
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 должен быть в формате массива
Я не понимаю, зачем вам нужно 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 ?,?
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, но с этим запросом вы не получите желаемое значение?