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

  • Автор темы Автор темы Spear
  • Дата начала Дата начала

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:

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

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

Собрать такой массив несложно :) вывести ещё проще.. нет? :) Вообще это тоже самое что делать руками - просто кое что можно переложить на internal-вещи.. =)
 
DiTHER
честно говоря совершенно не понял как мне такой массив поможет достичь желаемого резцльтата :(
 
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>';
}
?>
 
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 в предыдущую категорию.. но я н ензаю как это сделать :( Буду очень Вам благодарен за помощь.
 
если бы можно было ка-то в цикле проверить, что мол не является ли айдишник, который обрабатывается сейчас тому, который был обработан до этого,
и кто тебе мешает проверить?
тебе неизвестен оператор сравнения?
или ты не можешь присвоить в кеонце цикла айдишник временной переменной, чтобы в следующем проходе цикла сравнить?
Ну так посмотрел бы на последний кусок кода который тебе дали
 
Ты лучше скажи кто тебя научил запрос делать в цикле?

-~{}~ 17.07.05 11:29:

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

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