|
|
|
| Здравствуйте, помогите составить запрос сделать вывод форумов и подфорумов одним запросом как в этом форуме 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;
|
то есть сколько форумом столько и обращений к базе для проверки нет ли в конкретном форуме подфорумом
Помогите объединить запросы, чтобы можно было вывести все один раз
если это не возможно то так и напишите, заранее спасибо | |
|
|
|
|
|
|
|
для: Visavi
(22.09.2009 в 22:19)
| | я бы собрал рез-т запроса в массив, а оттуда уже строил бы список. | |
|
|
|
|
|
|
|
для: Visavi
(22.09.2009 в 22:19)
| | если этот список форумов с подфорумами не часто изменятся и кроме вывода оттуда не для чего не используется , то можно сделать более удобную таблицу для вывода одним запросом,
, где даже не нужен будет ORDER BY или сортировка по id, а выборка будет идти так как навалено. один поток данных в таком порядке в каком он нужен
Толлько ещё одно поле, в котором одна или другая глубина вложенности , форум или подфорум
с неограниченной вложенностью тоже можно сделать так, но усложнится перенаваливание этой таблицы после любого изменения, особенно если нужно вручную всё перераспределять | |
|
|
|
|
|
|
|
для: heed
(23.09.2009 в 13:40)
| | Э... ORDER BY не нужен кагбе в двух случаях.
Когда выборка из одной строки и
когда порядок выборки не влияет на логику работы приложения с результатом запроса . | |
|
|
|
|
|
|
|
для: 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); // завершение меню
?>
|
| |
|
|
|
|
|
|
|
для: heed
(23.09.2009 в 15:27)
| | Работает, но безо всякой гарантии.
Стоит пару строк убрать/добавить, и всё посыпется. | |
|
|
|
|
|
|
|
для: 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 или больше, то как все занести в массив или выводить из базы | |
|
|
|
|
|
|
|
для: 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'];
|
| |
|
|
|
|
|
|
|
для: 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 то делать подзапрос и выводить список подфорумом
так нормально будет? | |
|
|
|
|
|
|
|
для: Visavi
(23.09.2009 в 16:09)
| | Про ущербность запроса вида SELECT f1.*, ...GROUP BY f1.forums_id я писал на этом форуме с полдюжины раз наверняка, а то и больше. А с последней отповеди прошло никак не больше недели.
Вы издеваетесь изощренно таким образом чтоли? | |
|
|
|
|
|
|
|
для: Trianon
(23.09.2009 в 16:48)
| | Я просто не очень хорошо знаком с запросами, работаю с sql всего пару месяцев, для меня еще многое не знакомо, подскажите пожалуйста как правильно сделать | |
|
|
|
|
|
|
|
для: Visavi
(23.09.2009 в 18:52)
| | Тогда Вам наверное на этом этапе не стоит применять группирующие запросы вообще.
Сперва подучить SQL, а потом уже...
Тем более, что как я вижу, Ваша задача их применения не требует. | |
|
|
|
|
|
|
|
для: Trianon
(23.09.2009 в 19:52)
| | можно ли тогда как-нибудь вывести число этих подфорумов если они есть, и 0 если их нет? Без вывода самих подфорумов | |
|
|
|
|
|
|
|
для: Visavi
(23.09.2009 в 21:59)
| | Э... а вот это уже причина для группирующего запроса, и повод подучить язык. :) | |
|
|
|