[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как написать запрос возвращающий вложенный массив
SoMeOnE
Имеется такой запрос.
$sth = $this->DB->prepare('
SELECT a.*, b.name as `bank_name`
FROM `atms` AS a
LEFT JOIN `banks` AS b ON a.bank_id = b.id
'
);
$sth->execute();
$atms = $sth->fetchAll(PDO::FETCH_ASSOC);


Он приблизительно возвращает такой овтет

Array
(
[0] => Array
(
[id] => 1
[bank_id] => 1
[name] => bank1
)

[1] => Array
(
[id] => 2
[bank_id] => 1
[address] => bank2
)
....
)


Возвращает много объектов. Мне нужно сгруппировать их по ключу bank_id допустим. Т.е что бы возвращал что то типа этого

Array
(
[1] => Array

[0] => Array
(
[id] => 1
[name] => bank1
)

[1] => Array
(
[id] => 2
[address] => bank2
)
.....
)


Через foreach пока сделал.
Интересно было узнать. Возможно ли реализовать такое прямо в запросе?
kaww
$atms = array($sth->fetchAll(PDO::FETCH_ASSOC));
, а если серьезно, то никак
Игорь_Vasinsky
на mysqli я бы сделал так

while($row = mysqli_fetch_assoc($query)){
$data[$row['bank_id']] = array($row['id'], $row['address']);
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Valick
Цитата
Возможно ли реализовать такое прямо в запросе?

на носу у нас что?
на входе у нас что? правильно - таблица
выбираем из чего? правильно из таблицы
результат выборки у нас что? правильно... корова

_____________
Стимулятор ~yoomoney - 41001303250491
Игорь_Vasinsky
а запросом... ну максимум можно отсортировать... может и есть такие возможности у SQL - но я с ними не знаком.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
neadekvat
SoMeOnE
1. Если ты не выполняешь никаких подстановок, то можно использовать query.

2. Что-то мне не нравится это "приблизительно". Что я вижу в SELECT: a.*, b.name as `bank_name`, что я вижу в массиве: name, address.. А где bank_name?
Приведи структуру бд с объяснениями.
SoMeOnE
Цитата (neadekvat @ 19.12.2012 - 16:29)
2. Что-то мне не нравится это "приблизительно". Что я вижу в SELECT: a.*, b.name as `bank_name`, что я вижу в массиве: name, address.. А где bank_name?
Приведи структуру бд с объяснениями.

Ну я как бы подумал коммерческая тайна и все такое)))
Основной запрос делаю к таблице банкоматы. Там поля

1 id int(11) No None AUTO_INCREMENT
2 bank_id int(11) No None
3 name varchar(255) utf8_general_ci No None
4 address varchar(255) utf8_general_ci No None
5 longitude varchar(20) utf8_general_ci No None
6 latitude varchar(20) utf8_general_ci No None

Каждый банкомат привязан к своему банку
Таблица банков.
1	id		int(11)						No	None	AUTO_INCREMENT	  
3 name varchar(255) utf8_general_ci No None
4 address varchar(255) utf8_general_ci No None


В таблице банкоматов хранится id банка к кторому он принаджедит. Мне нужно получить теперь все банкоматы из таблицы. Получаю. После группирую все банкоматы по родительскому банку средствами php. Допустим прохожу полученный массив foreach и создаю удобный для себя массив, что нормально в виде уже с ним работать.

Для себя хотелось бы узнать. Можно ли средствами sql реализовать такое. Что бы он вместо php собралбы мне массив, который будет состоять из сложного массива. Сначала перечисление банков. И каждый банк состоит из массива, который содержит все свои банкоматы. Примерно так как я в первом посте показал, хоть и убрал некоторые данные

В примере выше я в торопях убрал некоторые данные. Что бы поменьше было. Не путать желающих помочь)
Valick
запрос возвращает таблицу, даже из одного столбца, это все равно таблица (не пряник, не пассатижи, не северное сияние, не массив, а всего лишь таблица)
а теперь спросим у википедии
____
надеюсь это последнее сообщение в теме, опустили глаза, покраснели, думаем....


_____________
Стимулятор ~yoomoney - 41001303250491
neadekvat
Одним запросом вряд ли такое можно сделать. Можно с помощью процедуры, но нафиг с этим связываться, не та задача.

Допустим, atms - таблица банкоматов, banks - банки. На основе твоего запроса:
SELECT a.*, b.name as `bank_name`, b.`address` as `bank_address`, `id` as `bank_id`
FROM `atms` AS a
LEFT JOIN `banks` AS b ON a.bank_id = b.id
ORDER BY bank_id


А затем в выборке, т.к. по банкам уже отсортировано, создаем многомернй массив. Примерно так:
$cur_bank_id = 0;
$res = array();
while($arr = {получаем запись})
{
if ($arr['bank_id'] != $cur_bank_id) {
$cur_bank_id = $arr['bank_id'];
$res[$cur_bank_id] = array(
'id' => $arr['bank_id'],
'name' => $arr['bank_name'],
'address' => $arr['bank_address'],
'atms' => array();
);

}

$res[$cur_bank_id]['atms'][$arr['id']] = array(
'id' = $arr['id'],
'address' = $arr['address'],
);

}


Собственно, использование id как индекса - это уже произвольное решение, можно и без этого.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.