Подсчет количества записей в SQL-базе

12
J
На сайте с 02.02.2009
Offline
53
#11

Так выше же хороший пример с группировкой :))

Перефразируя -

SELECT t.id, COUNT(*) FROM topics t INNER JOIN comments c ON c.topic_id = t.id GROUP BY t.id

выведет ID статей и сколько для них комментариев

То есть более-менее рабочее:



$results = mysql_query("SELECT t.id, t.name, COUNT(*) FROM topics t INNER JOIN comments c ON c.topic_id = t.id GROUP BY t.id");
if($results && mysql_num_rows($results) != 0){
while($row = mysql_fetch_row($results)){
echo "Статья ".$row[1]." имеет ".$row[2]." комментариев<br>";
}
}
Brand from Amber
На сайте с 18.08.2007
Offline
293
#12

Не читал весь тред, но скажу, что есть вариант добавить в новостную таблицу поле reply_count и при добавлении нового комментария вносить изменение в это поле. ИМХО самый правильны вариант.

Лучший способ понять что-то самому - объяснить это другому.
S
На сайте с 27.02.2007
Offline
60
#13

чё за reply_count? Это спец-поле? И как его увязать? Если просто вносить номер, при записи коммента, то это легко, но есть НО: миисам транзакции не понимает, можно вписать в 1 таблицу, но не вписать в другую. Возникает несоответствие... не хотелось бы.

Создание сайтов, документация... (http://site3k.net/), сайт нашей дизайн-студии (http://website-it.ru/)
S
На сайте с 27.02.2007
Offline
60
#14

jumash,

Использовал в таком виде:

$sql ='SELECT COUNT(*),b.id,b.name,b.`create`,b.`date_create`,b.pre ';

$sql.='FROM '.table_blogs.' b ';

$sql.='LEFT JOIN '.table_comments.' c ';

$sql.='ON c.id_blog = b.id ';

$sql.='GROUP BY b.id ';

$sql.='ORDER BY b.`date_create` DESC ';

$sql.='LIMIT '.$from.','.maxlines;

С INNER JOIN чё-то не то пулучалось (вообще, я пока не вьехал, чем INNER JOIN отличается от LEFT JOIN)

но если комментов нет, пишет 1 (так как 1 строка получается за счет таблици статей)

Но мне подсказали такой вариант:

$sql ='SELECT b.id,b.name,b.`create`,b.`date_create`,b.pre, COALESCE(cnt, 0) as cmtcnt ';

$sql.='FROM '.table_blogs.' b ';

$sql.='LEFT JOIN (SELECT id_blog,COUNT(*) as cnt FROM '.table_comments.' WHERE `checked` GROUP BY id_blog) as c ';

$sql.='ON c.id_blog = b.id ';

$sql.='GROUP BY b.id ';

$sql.='ORDER BY b.`date_create` DESC ';

$sql.='LIMIT '.$from.','.maxlines;

В нем, если коментов нет, показывает ноль (как и положено)

Так что, кому нужно выполнять аналогичные задачи - юзайте

ZA
На сайте с 18.02.2009
Offline
7
#15
Supervisork:
чё за reply_count? Это спец-поле?

Как уже говорили выше оптимальным вариантом будет добавить к таблице статей дополнительное поле в котором хранить количество коментариев (и обновлять его по мере добавления/удаления коментариев).

Чтобы другого вы не придумывали - всеравно рано или поздно прийдете к этому решению, поэтому мой вам совет не теряйте время на поиск решений которых нету. Добавляйте доп. поле и реализуйте его изменение/синхронизацию.

S
На сайте с 27.02.2007
Offline
60
#16

Я уже нашел решение и постом выше привел 2 варианта

ZA
На сайте с 18.02.2009
Offline
7
#17

Supervisork,

ну ну.. думаете изобрели велосипед? :)

Если вопрос быстродействия и масштабированности (работоспособность при значительном увеличении записей в таблицах) вас не волнует - то что вы предложили можно назвать "вариантом".

Не хотите слушать советов, хотите набить собственные шышки, а затем судорожно переделывать код когда сервер начнет загибаться под нагрузкой ? .. запрещать не буду - это ваше право.

S
На сайте с 27.02.2007
Offline
60
#18

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

12

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