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

Форум MySQL

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

 

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

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

тема: Вывести форумы с подфорумами
 
 автор: Visavi   (22.09.2009 в 22:19)   письмо автору
 
 

Здравствуйте, помогите составить запрос сделать вывод форумов и подфорумов одним запросом как в этом форуме sql.ru/forum, бьюсь уже неделю ничего не получается, решил написать сюда

Имеется одна таблица forums
forums_id INTEGER PRIMARY KEY NOT NULL,
forums_order INTEGER UNSIGNED NOT NULL DEFAULT '0',
forums_parent INTEGER UNSIGNED NOT NULL DEFAULT '0', 
forums_title varchar(100) NOT NULL


в котором forums_order служит для сортировки, а forums_parent обозначает что это подфорум относится к какому-то форуму
вывожу список всех форумов

SELECT * FROM forums WHERE forums_parent=0 ORDER BY forums_order ASC;


а подфорумы уже в цикле при выводе заголовков
SELECT * FROM forums WHERE forums_parent=".$data['forums_id']." ORDER BY forums_order ASC;

то есть сколько форумом столько и обращений к базе для проверки нет ли в конкретном форуме подфорумом

Помогите объединить запросы, чтобы можно было вывести все один раз
если это не возможно то так и напишите, заранее спасибо

  Ответить  
 
 автор: ride   (23.09.2009 в 08:57)   письмо автору
 
   для: Visavi   (22.09.2009 в 22:19)
 

я бы собрал рез-т запроса в массив, а оттуда уже строил бы список.

  Ответить  
 
 автор: heed   (23.09.2009 в 13:40)   письмо автору
 
   для: Visavi   (22.09.2009 в 22:19)
 

если этот список форумов с подфорумами не часто изменятся и кроме вывода оттуда не для чего не используется , то можно сделать более удобную таблицу для вывода одним запросом,
, где даже не нужен будет ORDER BY или сортировка по id, а выборка будет идти так как навалено. один поток данных в таком порядке в каком он нужен
Толлько ещё одно поле, в котором одна или другая глубина вложенности , форум или подфорум
с неограниченной вложенностью тоже можно сделать так, но усложнится перенаваливание этой таблицы после любого изменения, особенно если нужно вручную всё перераспределять

  Ответить  
 
 автор: Trianon   (23.09.2009 в 14:04)   письмо автору
 
   для: heed   (23.09.2009 в 13:40)
 

Э... ORDER BY не нужен кагбе в двух случаях.
Когда выборка из одной строки и
когда порядок выборки не влияет на логику работы приложения с результатом запроса .

  Ответить  
 
 автор: heed   (23.09.2009 в 15:27)   письмо автору
 
   для: Trianon   (23.09.2009 в 14:04)
 

Но работает-же,)
CREATE TABLE `ctg` (
 `id` SMALLINT unsigned NOT NULL AUTO_INCREMENT,
  `lvl` TINYINT unsigned NOT NULL DEFAULT '0',
  `dscr` varchar(225) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

INSERT INTO ctg (lvl, dscr)
VALUES
(1,'первый уровень'),(1,'второй первый уровень'),
(2,'подуровень второго'),
(2,'второй подуровень второго'),
(2,'третий подуровень аторого'),
(3,'подуровеньтретьего подуровня'),
(1,'уровень три'),
(2,'подуровень уровня три'),
(1,'уровень четыре'),
(1,'уровень пять'),
(2,'уровень пять один'),
(3,'уровень пять один один'),
(4,'уровень пять один один один'),
(3,'уровень пять один два'),
(1,'уровень восемь');
SELECT * FROM ctg c;

думаю нигде в мануалах не запрещено перенаваливать таблицу после каждого изменения в ней :)
<?
function list_print($t 0$txt='' ) {
    global 
$itr;
    static 
$mem '';
    static 
$last 1;
if (
$t == -1) { // если завершение
 
echo '<li>' $mem  '</li>' "\n"
    
str_repeat'</ol>' "\n"
    
.'</li>' "\n ", ($itr 1)) . '</ol></div>' "\n";
  return ;
}
if (
$itr == 0)  { // если главный пункт
 
echo '<div id="map"><ol>'    ."\n";
    
$mem $txt;
 }
else if (
$t == $itr) {
 echo
'<li>' $mem  '</li>' "\n";
}
else if (
$t $itr) {
 echo 
'<li>' $mem
    
.'<ol>'  "\n";
}
else if (
$t $itr) {
 echo 
'<li>' $mem  '</li>' "\n"
    
str_repeat('</ol>' "\n" .'</li>' "\n ", ($itr-$t));
}
    
$itr $t;
    
$mem $txt;
# end of  menu_print()
###########################

$dbserv 'localhost';
$dbname 'xdb';
$dbuser 'root';//'root';//
$dbpassword 'root';//'';//

if (!$link = @mysql_connect$dbserv$dbuser$dbpassword))
s_error(true'MySQL not available.'true);
if (!
mysql_select_db($dbname$link)) s_error(true'база данных ' $dbname ' недоступна'true);
mysql_query('SET NAMES "cp1251"');


$query mysql_query('SELECT lvl, dscr
    FROM ctg'
);

//echo mysql_num_rows($query) . '<hr/>';
$itr 0;
while (
$row mysql_fetch_row($query)) {
list_print($row[0], $row[1]);// формирование меню
}
list_print(-1); // завершение меню
?>

  Ответить  
 
 автор: Trianon   (23.09.2009 в 15:32)   письмо автору
 
   для: heed   (23.09.2009 в 15:27)
 

Работает, но безо всякой гарантии.
Стоит пару строк убрать/добавить, и всё посыпется.

  Ответить  
 
 автор: Visavi   (23.09.2009 в 14:20)   письмо автору
 
   для: heed   (23.09.2009 в 13:40)
 

на sql.ru мне посоветовали сделать что-то подобное
SELECT f1.*, f2.forums_title AS subforums FROM forums f1 LEFT JOIN forums f2 ON f2.forums_parent = f1.forums_id WHERE f1.forums_parent = 0 ORDER BY f1.forums_order ASC;

но если подфорума 2 или больше, то как все занести в массив или выводить из базы

  Ответить  
 
 автор: Trianon   (23.09.2009 в 15:17)   письмо автору
 
   для: Visavi   (23.09.2009 в 14:20)
 

$list[$row['forums_id'][] = $row['subforums'];

Но в таком виде он малополезен IMHO.
Я бы вытащил еще и subforums_id и написал
$list[$row['forums_id'][$row['subforums_id']] = $row['subforums_title'];

  Ответить  
 
 автор: Visavi   (23.09.2009 в 16:09)   письмо автору
 
   для: Trianon   (23.09.2009 в 15:17)
 

А если сделать так
SELECT f1.*, f2.forums_id AS subforums_id FROM forums f1 
LEFT JOIN forums f2 ON f2.forums_parent = f1.forums_id 
WHERE f1.forums_parent = 0 
GROUP BY f1.forums_id ORDER BY f1.forums_order ASC;

и при выводе форумов если subforums_id>0 то делать подзапрос и выводить список подфорумом
так нормально будет?

  Ответить  
 
 автор: Trianon   (23.09.2009 в 16:48)   письмо автору
 
   для: Visavi   (23.09.2009 в 16:09)
 

Про ущербность запроса вида SELECT f1.*, ...GROUP BY f1.forums_id я писал на этом форуме с полдюжины раз наверняка, а то и больше. А с последней отповеди прошло никак не больше недели.
Вы издеваетесь изощренно таким образом чтоли?

  Ответить  
 
 автор: Visavi   (23.09.2009 в 18:52)   письмо автору
 
   для: Trianon   (23.09.2009 в 16:48)
 

Я просто не очень хорошо знаком с запросами, работаю с sql всего пару месяцев, для меня еще многое не знакомо, подскажите пожалуйста как правильно сделать

  Ответить  
 
 автор: Trianon   (23.09.2009 в 19:52)   письмо автору
 
   для: Visavi   (23.09.2009 в 18:52)
 

Тогда Вам наверное на этом этапе не стоит применять группирующие запросы вообще.
Сперва подучить SQL, а потом уже...
Тем более, что как я вижу, Ваша задача их применения не требует.

  Ответить  
 
 автор: Visavi   (23.09.2009 в 21:59)   письмо автору
 
   для: Trianon   (23.09.2009 в 19:52)
 

можно ли тогда как-нибудь вывести число этих подфорумов если они есть, и 0 если их нет? Без вывода самих подфорумов

  Ответить  
 
 автор: Trianon   (23.09.2009 в 22:13)   письмо автору
 
   для: Visavi   (23.09.2009 в 21:59)
 

Э... а вот это уже причина для группирующего запроса, и повод подучить язык. :)

  Ответить  
Rambler's Top100
вверх

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