Вопрос по вытаскиванию данных из БД со сложным выводом на страницу

Spear

почемучка
Вопрос по вытаскиванию данных из БД со сложным выводом на страницу

Сразу прошу прощения за не понятное название темы - протсо не знаю как точнее описать то, что я немогу сделать :(
Буду очень рад за Вашу помощь в такой задаче:

Есть таблица стуктуры

| id | type | text | date |

id - номер обьекта в другой таблице, к которому относится запись этой таблицы
type - тип документа
text - текст документа
date - дата занесения записи.

В этой таблице хранятся некоторые материалы, связанные с другими данными в другой таблице.

Стараюсь вывести данные из этой таблице, но не так (пример. Название берутся из другой таблице по id)

Холодильик р-1, руководство пользователя, 01.01.1970
Холодильик р-1, изображение, 01.01.1970
Холодильик р-1, тех. информация, 01.01.1970
Холодильик р-1, ещё что-то, 01.01.1970

а так:

Холодильик р-1:
------------------------- руководство пользователя, 01.01.1970
------------------------- изображение, 01.01.1970
------------------------- тех. информация, 01.01.1970
------------------------- ещё что-то, 01.01.1970

Я в растерянности :( не нзаю даже как это реализовать.
Нужно это для того, чтобы не нагружать страницу массой ненужного текста (каждый раз повторяющегося название объекта) а выводить это... группами что-ли?

учитывая что запрос выполняется в while и таких объектов на страницу может быть около 200 штук.
То есть сделать сначала выбор айдишника а потом внутри вайла ещё один запрос на проверку всего что есть по этому объекту - нельзя, так как будет 200 запросов в бд на ровном месте).

Буду очень благодарен за любые идеи.

-~{}~ 16.07.05 03:49:

может можно как-то проверять в вайле айди выведенной до этого информации, и если предыдущая равна выводимой сейчас то уже не выводить названия.. только как это сделать? :( незнаю :(
 

DiTHER

bang bang
:)

а если в конце получить нечто вида
$arr[$id][$idx] = array([type],[text],[date])
где $id = это Холодильник, idx - номер записей относящихся к Холодильник, а дальше - понятно.

Собрать такой массив несложно :) вывести ещё проще.. нет? :) Вообще это тоже самое что делать руками - просто кое что можно переложить на internal-вещи.. =)
 

Spear

почемучка
DiTHER
честно говоря совершенно не понял как мне такой массив поможет достичь желаемого резцльтата :(
 

Groove

Новичок
PHP:
<?
$all = array();
$all[] = array(
  'category_name' => 'Холодильик р-1',
  'items' => array(
    array(
      'text' => 'руководство пользователя',
      'date' => '01.01.1970',
    ),
    array(
      'text' => 'изображение',
      'date' => '01.01.1970',
    ),
    array(
      'text' => 'тех. информация',
      'date' => '01.01.1970',
    ),
    array(
      'text' => 'ещё что-то',
      'date' => '01.01.1970',
    ),
  )
);
$all[] = array(
  'category_name' => 'Холодильик р-2',
  'items' => array(
    array(
      'text' => 'руководство пользователя',
      'date' => '01.01.1970',
    ),
    array(
      'text' => 'изображение',
      'date' => '01.01.1970',
    ),
    array(
      'text' => 'тех. информация',
      'date' => '01.01.1970',
    ),
    array(
      'text' => 'ещё что-то',
      'date' => '01.01.1970',
    ),
  )
);
foreach($all as $k=>$v){
  print '<h1>'.$v['category_name'].'</h1>';
  foreach($v['items'] as $key=>$val){
    print str_repeat('&nbsp;',10).$val['text'].' ['.$val['date'].']<br>';
  }
}
?>
или намного проще:
PHP:
<?
$db_result = array();
/*выборка из БД*/
for ($y=0; $y<10; $y++){
  for ($i=0; $i<10; $i++){
    $db_result[] = array(
      'category_id' => $y,
      'category_name' => 'Холодильик р-'.$y,
      'id' =>$i,
      'text' => 'text'.$i,
      'date' => '01.01.1970',
    );
  }
}


$cat_id=-1;
foreach($db_result as $v){
  if($cat_id!=$v['category_id']){
    print '<h1>'.$v['category_name'].'</h1>';
    $cat_id=$v['category_id'];
  }
  print str_repeat('&nbsp;',10).$v['text'].' ['.$v['date'].']<br>';
}
?>
 

Spear

почемучка
Groove
Спасибо, буду разбираться ;)

-~{}~ 17.07.05 06:56:

Groove
Эх, блин опять не получается.

Пользуясь вашим кодом, сначала в цикле делаю:

PHP:
$all[] = array(
  'category_name' => $titlex,
  'items' => array(
    array(
      'text' => $type_txt,
      'date' => $newdate,
    ),

  )
);
И потом вывожу (это из первого варианта.

Но всеравно выводится каждый раз название и каждый раз тип документа :(

-~{}~ 17.07.05 06:58:

если бы можно было ка-то в цикле проверить, что мол не является ли айдишник, который обрабатывается сейчас тому, который был обработан до этого, и если да, то писать в масив в items в предыдущую категорию.. но я н ензаю как это сделать :( Буду очень Вам благодарен за помощь.
 

Фанат

oncle terrible
Команда форума
если бы можно было ка-то в цикле проверить, что мол не является ли айдишник, который обрабатывается сейчас тому, который был обработан до этого,
и кто тебе мешает проверить?
тебе неизвестен оператор сравнения?
или ты не можешь присвоить в кеонце цикла айдишник временной переменной, чтобы в следующем проходе цикла сравнить?
Ну так посмотрел бы на последний кусок кода который тебе дали
 

gromitus

Новичок
Ты лучше скажи кто тебя научил запрос делать в цикле?

-~{}~ 17.07.05 11:29:

А то 200 раз у него запрос будет выполняться
 

Spear

почемучка
фух, заработал второй вариант.
Такой вопрос - если допустим в бд идут не по порядку записи для одного и того же айдишника, всеравно сделается группировка по обьектам и материалам по ним?
 

Spear

почемучка
Фанат

да нет же я не о том. Конечно если сделать сортировку по айдишнику то все окей. Но если пользователь отсортировал по дате или по названию? :(
Я же потому и спросил - может можно как-то ещё доработать код Grooveа чтобы он проверял каждый раз к какому обьекту относится запись.. ну что-то вроде этого. Буду очень благодарен
 

Groove

Новичок
сперва сортируй по category_id, а потом по остальным полям (по дате или по названию), что тут непонятного?
 
Сверху