Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Группировка результата
 
 автор: DimaXP   (30.10.2005 в 11:45)   письмо автору
 
 

Делаю форум!
1-я таблица categories; столбцы: id, name.
2-я таблица forums; столбцы: id, name, category.

id name
1 Первая категория
2 Вторая категория
3 Третья категория

id name category
1 Первый 1
2 Форум №2 1
3 Форум №3 1
4 Форум №4 3

id первой таблицы должна совпадать с category второй таблицы



$arra = $db->query("SELECT c.id AS cid, c.name AS cname, f.name AS fname, f.description AS fdescription FROM ".$smpd['table']['categories']." AS c INNER JOIN ".$smpd['table']['forums']." AS f ON c.id=f.category ORDER BY c.position ASC");
 for($i=0;$i<$db->count($arra);$i++)
  {
   $co = $db->fetch($arra);
   $text.= "<BR>
   <DIV class=tableborder><DIV class=maintitle align=left><A href='".$co[cid]."'>".$co[cname]."</A></DIV>
   <TABLE cellSpacing=1 cellPadding=4 width='100%' border=0>
   <TBODY><TR>
   <td class=titlemedium align=middle width='2%'><IMG height=1 alt='' src='' width=28></td>
   <td class=titlemedium align=left width='59%'>Форум</td>
   <td class=titlemedium align=middle width='7%'>Тем</td>
   <td class=titlemedium align=middle width='7%'>Ответов</td>
   <td class=titlemedium align=left width='25%'>Обновления</td></TR>
   <TR></TBODY>
   </TABLE></DIV>";
  }


В результате выходит "Первая категория" аж три раза, потому что к ней принадлежит 3 форума.
Что в коде нужно поправить, чтоб по человечески отображалась каждая категория по одному разу, и чтоб если категория без форума,
то она не отображалась. Спасибо.

   
 
 автор: cheops   (30.10.2005 в 13:19)   письмо автору
 
   для: DimaXP   (30.10.2005 в 11:45)
 

Необходимо сгруппировать (GROUP BY) результат по категориям, т.е.
<?php
$query 
"SELECT c.id AS cid, 
                 c.name AS cname, 
                 f.name AS fname, 
                 f.description AS fdescription 
          FROM "
.$smpd['table']['categories']." AS c INNER JOIN ".$smpd['table']['forums']." AS f 
          ON c.id=f.category 
          GROUP BY c.name
          ORDER BY c.position ASC"

$arra $db->query($query);
?>

   
 
 автор: DimaXP   (30.10.2005 в 13:45)   письмо автору
 
   для: cheops   (30.10.2005 в 13:19)
 

Спасибо большое!!!!

   
 
 автор: DimaXP   (30.10.2005 в 15:21)   письмо автору
 
   для: DimaXP   (30.10.2005 в 13:45)
 

Еще можно вопросик?

Я сделал вот так. Файл glav_cat.htm это шапка категории, файл glav_forum.htm это отображение форумов в данной категории,
но почему то они отображаются по одному форуму на категорию, опять что-то неправельно сделал?


<?
$file 
file("templates/$templ_name/forum/glav_cat.htm") or error (2"Файл glav_cat.htm  не доступен");
$file_forum file("templates/$templ_name/forum/glav_forum.htm") or error (2"Файл glav_forum.htm  не доступен");
$arra $db->query("SELECT c.id AS cid, f.id AS fid, c.name AS cname, f.name AS fname, f.description AS fdescription FROM ".$smpd['table']['categories']." AS c INNER JOIN ".$smpd['table']['forums']." AS f ON c.id=f.category GROUP BY c.name ORDER BY c.position ASC");
 for(
$i=0;$i<$db->count($arra);$i++)
  {
   
$co $db->fetch($arra);
 
   foreach(
$file as $c)
   {
    
$c str_replace("@name@""<a href="">".$co[cname]."</a>"$c);
    
$text.=$c;
   }
  
   foreach(
$file_forum as $f)
   {
    
$f str_replace("@forum@""<a href=".$co[fid].">".$co[fname]."</a>"$f);
    
$f str_replace("@desc@"$co[fdescription], $f);
    
$text.=$f;
   }
?>

   
 
 автор: cheops   (30.10.2005 в 22:55)   письмо автору
 
   для: DimaXP   (30.10.2005 в 15:21)
 

Сложно судить так как нам не известно содержимое страниц... Что выводится сейчас и что должно выводится на самом деле?

   
 
 автор: DimaXP   (31.10.2005 в 00:27)   письмо автору
 
   для: cheops   (30.10.2005 в 22:55)
 

Если смотреть из таблицы что я вверху привел, то сейчас выводится:
Категория Первая категория за ней форум Первый, а должны быть еще Форум №2, и Форум №3

Далее опять категория Третья категория за ней форум Форум №4.

Категория Вторая категория не выводится, так как к ней нет форумов.

надеюсь понятно объяснил, на рисунке то, что выводится.

   
 
 автор: cheops   (31.10.2005 в 02:54)   письмо автору
 
   для: DimaXP   (31.10.2005 в 00:27)
 

Сгруппируйте не по категориям GROUP BY c.name, а по форуму GROUP BY f.name... Что получается?

   
 
 автор: DimaXP   (31.10.2005 в 05:24)   письмо автору
 
   для: cheops   (31.10.2005 в 02:54)
 

Получается почти как раньше. Первая категория отображается 3 раза, по кол-ву форумов, и т.д. Вообщем сколько форумов столько и котегорий. Результат на рис.

   
 
 автор: cheops   (31.10.2005 в 12:33)   письмо автору
 
   для: DimaXP   (31.10.2005 в 05:24)
 

Хм... значит у вас код так организован. Что делают циклы, в первую очередь внешний цикл и почему внутренних циклов два?

   
 
 автор: DimaXP   (31.10.2005 в 20:49)   письмо автору
 
   для: cheops   (31.10.2005 в 12:33)
 

Что то я не пойму о каких циклах идет речь. Если я правельно понимаю внешний это


<?php
for($i=0;$i<$db->count($arra);$i++)
  {
   
$co $db->fetch($arra);
  }
?>


А внутренние это:

<?php
 
foreach($file as $c)
   {
    
$c str_replace("@name@""<a href=".$co[cname].">".$co[cname]."</a>"$c);
    
$text.=$c;
   }
?>


Если я правельно понял, то внешний служит для вывода записей из таблици. А внутренние это часть шаблона. А их не может быть два? Может их разъеденить?

   
 
 автор: cheops   (01.11.2005 в 12:47)   письмо автору
 
   для: DimaXP   (31.10.2005 в 20:49)
 

Нет их может быть два и больше... но у меня большое подозрение, что цикл
foreach($file_forum as $f)

вложен
foreach($file as $c)

Хотя может и нет... вообще результаты представляются в виде
Первая категория Форум1
Первая категория Форум2
Первая категория Форум3
Вторая категория Форум4
Вторая категория Форум5
Вторая категория Форум6
Т.е. имя категории будет присутствовать в результирующей таблице столько раз, сколько форумов в нём - такую ситуацию следует обрабатывать. Как я понимаю она не обрабатывается и получается несколько категорий.

   
 
 автор: DimaXP   (03.11.2005 в 11:08)   письмо автору
 
   для: cheops   (01.11.2005 в 12:47)
 

Все сделал! У меня еще вопрос, как сделать, чтоб в конце страницы подсчитывалось количество запросов к базе данных?

   
 
 автор: napTu3aH   (03.11.2005 в 11:23)   письмо автору
 
   для: DimaXP   (03.11.2005 в 11:08)
 

Можно создать переменную со значением 0. А при каждом запросе прибавлять к ней 1. Хотя возможно есть методы лучше.

   
 
 автор: cheops   (03.11.2005 в 13:20)   письмо автору
 
   для: DimaXP   (03.11.2005 в 11:08)
 

Имеется ввиду вообще для всего сервера или только выполненые данным скриптом? Если последнее лучше воспользоваться вариантом, предложенным napTu3aHом.

   
 
 автор: DimaXP   (03.11.2005 в 17:38)   письмо автору
 
   для: cheops   (03.11.2005 в 13:20)
 

Понятно, спасибо вам!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования