Как правильно построить запрос и вывод php и sql

Zion-i2
На сайте с 10.06.2011
Offline
108
1185

В общем практически закончил свой форум и сейчас просматриваю запросы и заметил один момент на который сразу не обратил внимание, и как мне показалось такой метод вывода из базы может создать или даже думаю будет создавать нагрузку на сервер.

Вот запрос, скопируйте если не лень в редактор ато тут еси обрамляю код в php - часть кода превращается в звездочки и цифры.

<?php
$sql = mysql_query('SELECT * FROM questions WHERE parent="'.$f.'"',$db);
while($row=mysql_fetch_array($sql)){
$id_ques=$row['id_ques'];
$header=$row['header'];
?>
<a href="dialog.php?id_ques=<?php echo $id_ques; ?>"><?php echo $header; ?></a>
<?
$res = mysql_query('SELECT COUNT(*) FROM answers WHERE parent="'.$id_ques.'"',$db);
$row = mysql_fetch_row($res);
$total = $row[0]; // всего записей
echo $total;
?>
<?php
}
?>

То есть получается я вывожу айди вопроса и заголовок, затем выхожу из php (но находясь в цикле) и запускаю подсчет и вывод ответов на вопросы из другой таблицы, таким образом выходит, что если я вывожу 30 тем на страницу, то запрос

<?
$res = mysql_query('SELECT COUNT(*) FROM answers WHERE parent="'.$id_ques.'"',$db);
?>

Будет выполнятся 30 раз, 30 обращений к базе данных, можно ли както упростить или сделать по другому?

Я думаю что можно вывести из двух таблиц в одном запросе но как это сделать не знаю, а точнее как отделить переменные из одной таблицы и из другой.

IL
На сайте с 20.04.2007
Offline
435
#1
Zion-i2:
или даже думаю будет создавать нагрузку на сервер.

так проверить можно... заполнить lorem-lorem и погонять... ab, например.

Zion-i2:
Я думаю что можно вывести из двух таблиц в одном запросе но как это сделать не знаю,

Можно... см Join

Zion-i2:
а точнее как отделить переменные из одной таблицы и из другой.

Именем таблицы через точку

SELECT tablename1.tablefield1,tablename2.tablefield2 FROM tablename1, tablename2

p.s. всё это в документациях имеется... и в коде движков.. (вы ведь просмотрели-изучили, прежде чем своё писать?)

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
siv1987
На сайте с 02.04.2009
Offline
427
#2

Zion-i2, во первых у вас наверное должны быть какие-то лимиты в запросе с questions

во вторых статистику обычно принято вести в одной таблице, что-бы не делать такие запросы.

SELECT q.*, COUNT(*) as count FROM questions q LEFT JOIN answers a ON a.parent=q.id_ques GROUP BY q.id_ques

но по моему этот запрос не очень оптимален, так как создается большая таблица

SELECT q.*, (SELECT COUNT(*) FROM answers WHERE parent=id_ques) as count FROM questions q

Еще вариант.

Удобно ставить условия и делать сортировку, запрос будет выполнятся очень быстро даже на сотни тысяч записей.

SELECT q.*, z.count FROM questions q INNER JOIN (SELECT q.id_ques, COUNT(*) as count FROM questions q LEFT JOIN answers a ON a.parent=q.id_ques WHERE q.parent={$f} GROUP BY q.id_ques ORDER BY a.post_date DESC LIMIT 0,10) z ON z.id_ques=q.id_ques

a.post_date - дата поста

LIMIT 0,10 - количество тем на странице

Zion-i2
На сайте с 10.06.2011
Offline
108
#3

Все! тема не актуальна, спасибо siv1987 - помог решить задачу, как говорится все гинеальное просто!

А вообще лучше всего использовать счетчик в questions - posts. Добавили новое сообщение +1 к posts. Удалили сообщение -1 к posts.

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