Как построить Sql Запрос что бы получить данные из таблицы в одну строку
есть таблица worker (работник) с данными — id (id работника), first_name (имя), last_name
(фамилия)
таблица child (ребенок) с данными — worker_id (id работника), name (имя ребенка)
таблица car (машина) с данными — worker_id (id работника), model (модель машины)
Есть запрос: $sql = "SELECT * FROM worker INNER JOIN car ON worker.id = car.user_id INNER JOIN child ON worker.id = child.user_id"; $result = $db->query($sql); $worker = $result->fetchAll(PDO::FETCH_ASSOC);
print_r($worker);
на выходе получаю : Array ( [0] => Array ( [id] => 1 [first_name] => Алексей [last_name] => Бирюзуцкий [user_id] => 1 [model] => Lada [name] => Кирилл )
[1] => Array
(
[id] => 1
[first_name] => Алексей
[last_name] => Бирюзуцкий
[user_id] => 1
[model] => Lada
[name] => Алина
)
[2] => Array
(
[id] => 2
[first_name] => Константин
[last_name] => Коновалов
[user_id] => 2
[model] => Mazda
[name] => Дима
)
[3] => Array
(
[id] => 2
[first_name] => Константин
[last_name] => Коновалов
[user_id] => 2
[model] => Mazda
[name] => Костя
)
а Нужно :
Array ( [0] => Array ( [id] => 1 [first_name] => Алексей [last_name] => Бирюзуцкий [user_id] => 1 [model] => Lada [name] => Кирилл,Алина ) [1] => Array ( [id] => 2 [first_name] => Константин [last_name] => Коновалов [user_id] => 2 [model] => Mazda [name] => Дима, Костя )
Ответы (1 шт):
Исходный массив (измененный, для усложнения задачи):
$workers = [
[
'id' => 1,
'first_name' => 'Алексей',
'last_name' => 'Бирюзуцкий',
'user_id' => 1,
'model' => 'Lada',
'name' => 'Кирилл'
],
[
'id' => 1,
'first_name' => 'Алексей',
'last_name' => 'Бирюзуцкий',
'user_id' => 1,
'model' => 'Lada',
'name' => 'Алина'
],
[
'id' => 2,
'first_name' => 'Константин',
'last_name' => 'Коновалов',
'user_id' => 2,
'model' => 'Mazda',
'name' => 'Дима'
],
[
'id' => 2,
'first_name' => 'Константин',
'last_name' => 'Коновалов',
'user_id' => 2,
'model' => 'Mazda',
'name' => 'Костя'
],
[
'id' => 2,
'first_name' => 'Константин',
'last_name' => 'Коновалов',
'user_id' => 2,
'model' => 'Mazda',
'name' => 'Аня'
],
[
'id' => 2,
'first_name' => 'Константин',
'last_name' => 'Коновалов',
'user_id' => 2,
'model' => 'Mazda',
'name' => 'Маша'
],
];
Решение:
foreach ($workers as $worker1) {
foreach ($workers as $worker2) {
if ($worker1['id'] == $worker2['id']) {
$tmpWorkers[$worker2['id']]['names'][$worker2['name']] = $worker2['name'];
$tmpWorkers[$worker2['id']]['data'] = array_merge($worker1, $worker2);
$name = array_diff($worker1, $worker2)['name'];
if ($name) {
$tmpWorkers[$worker2['id']]['names'][$name] = $name;
$tmpWorkers[$worker2['id']]['data'] = array_merge($worker1, $worker2);
}
}
}
}
foreach ($tmpWorkers as $id => $value) {
$resultWorkers[$id] = $value['data'];
$resultWorkers[$id]['name'] = implode(',', $value['names']);
}
Вывод:
print_r($resultWorkers);
Array
(
[1] => Array
(
[id] => 1
[first_name] => Алексей
[last_name] => Бирюзуцкий
[user_id] => 1
[model] => Lada
[name] => Кирилл,Алина
)
[2] => Array
(
[id] => 2
[first_name] => Константин
[last_name] => Коновалов
[user_id] => 2
[model] => Mazda
[name] => Дима,Костя,Аня,Маша
)
)
Не самое лакончиное решение конечно, прошу сильно не бить, но задачу решает.