Оптимизация кода. Допустим ли Select в цикле?

TM
На сайте с 13.04.2007
Offline
10
6780

Здравствуйте!

Есть две таблицы - в одной находятся различные "ключевые" значения и их описания, структура такая: id, name, description (например - id:1, name:Сказкотерапия, description:Эта область психологии....).

Вторая таблица - со статьями, структура такая: id, name, article, catid (например - id:1, name:Введение, article:Текст статьи, catid: id категории, соответствует значению id первой таблицы.)


Задача - показать категории и под каждой из них вывести соответственные списки названий статей.

Подскажите, пожалуйста, допустимо ли такое решение с точки зрения грамотности, нагрузки на сервер и на базу данных?


//вывод списка категорий
$scat = mysql_query("select id, name from cat order by id") or die ("err1");
for($i = 0; $i < mysql_num_rows($scat); $i++)
{
$fn = mysql_fetch_array($scat);
echo "$fn[name]<br>";

//вывод подкатегорий
$sa = mysql_query("select * from articles where catid='$fn[id]'") or die ("err2");
for($i2 = 0; $i2 < mysql_num_rows($sa); $i2++)
{
$fa = mysql_fetch_array($sa);
echo "<li>$fa[name]</li>";
}
echo "<br><br>";
}

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

ND
На сайте с 11.04.2007
Offline
1
#1

Используй JOIN для объединения таблиц по cat_id, тем самым сведешь все к одному запросу.

http://apachedev.ru (http://apachedev.ru)
TM
На сайте с 13.04.2007
Offline
10
#2
NitroDev:
Используй JOIN для объединения таблиц по cat_id, тем самым сведешь все к одному запросу.

Спасибо за совет, свести в один запрос удалось, но возникла другая проблема - с выводом, который выглядит так:

test1

qwerty1

test1

Qwerty2

test1

Qwerty3

В данном случае test1 - это название категории в первой таблице ($fe[name]), а qwerty1...qwerty3 - названия статей во второй ($fe[text]).

Подскажите, пожалуйста, где ошибка? Код выглядит так:


$se = mysql_query("select * from articles left join cat on text.catid=cat.id") or die ("err1");
for($i = 0; $i < mysql_num_rows($se); $i++)
{
$fe = mysql_fetch_array($se);

echo "<br>$fe[name]<br>
<li>$fe[text]</li>";
}

Прошу прощения, за глупые вопросы.

AN
На сайте с 05.06.2004
Offline
243
#3

Order by вам в помощь :)

Размещу ваши баннеры на посещаемых сайтах. Места еще есть! Возможен безнал. (/ru/forum/324945) Нужны копирайтеры/рерайтеры - медики. Пишите в личку. (/ru/forum/676932)
TM
На сайте с 13.04.2007
Offline
10
#4
AnNik:
Order by вам в помощь :)

Прошу прощения, не правильно сформулировал вопрос.

Как убрать повторяющуюся строчку "test1"? Чтоб она показалась только раз. Если вывести её за цикл - соответственно, последующие категории (test2, test3, ...) показываться не будут.

Спасибо!

C
На сайте с 11.10.2006
Offline
67
cap
#5

Вместо * указывайте те поля, которые хотите выводить.

AN
На сайте с 05.06.2004
Offline
243
#6

$se = mysql_query("select * from cat, articles where text.catid=cat.id order by ...") or die ("err1");

$CurrCat = "";

for($i = 0; $i < mysql_num_rows($se); $i++)

{

$fe = mysql_fetch_array($se);

if ($CurrCat != fe[name]) {

$CurrCat = fe[name];

echo "<br>$fe[name]";

}

echo "<br><li>$fe[text]</li>";

}

TM
На сайте с 13.04.2007
Offline
10
#7

AnNik, огромное Вам спасибо! :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий