У меня следующие 2 таблицы со следующими значениями:
tbl_brand
id name
1 Apple
2 Samsung
tbl_products
id brand_id p_name
1 1 Мобильный
2 1 Earpods
3 2 Мобильный
Здесь, когда я использую левый запрос соединения, ie
SELECT 'b'.'id' as 'brand_id', 'b'.'name' as 'brand_name', 'p'.'p_name' as 'product_name' FROM 'tbl_brand' 'b' LEFT JOIN 'tbl_products' 'p' ON 'p'.'brand_id' = 'b'.'id'
и напечатать результат, я получаю следующий массив:
Array ( [0] => stdClass Object ( [brand_id] => 1 [brand_name] => Apple [product_name] => Mobile ) [1] => stdClass Object ( [brand_id] => 1 [brand_name] => Apple [product_name] => Earpods ) [2] => stdClass Object ( [brand_id] => 2 [brand_name] => Samsung [product_name] => Mobile )
Все работает нормально. Но результат, который я ищу, выглядит примерно так:
Array ( [0] => stdClass Object ( [brand_id] => 1 [brand_name] => Apple [product_name] => stdClass Object ( [0] => Mobile [1] => Earpods ) ) [1] => stdClass Object ( [brand_id] => 2 [brand_name] => Samsung [product_name] => Mobile )
Я хочу сгруппировать данные в соответствии с ключом brand_id
. Как я могу это сделать ?
Хотя вы можете генерировать нужный массив в одном цикле, я предпочел бы выполнить два запроса. Сначала выберите все бренды в массив и добавьте пустой массив продуктов для каждой марки. Затем загрузите все продукты и назначьте их соответствующему бренду.
Поскольку я не знаю, какую библиотеку БД вы используете, вот какой-то псевдокод:
$data = []; $brandResult = $db->query("SELECT id, name FROM tbl_brand"); while ($row = $brandResult->fetchObject()) { $row->product_names = []; $data[$row->id] = $row; } $productResult = $db->query("SELECT id, brand_id, p_name FROM tbl_products"); while ($row = $productResult->fetchObject()) { $data[$row->brand_id][$row->id] = $row->p_name; }
mysql возвращает строки, поэтому, если вам нужен многомерный массив, вы должны сами его построить. Петля вдоль этих строк будет делать это:
$array=array(); foreach ($result as $row) { $array[$row->brandid]['brandid'] = $row->brandid; $array[$row->brandid]['brand_name'] = $row->brand_name; $array[$row->brandid]['products'][] = $row->product; }