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

12
S
На сайте с 27.02.2007
Offline
60
4180

есть подборка статей. В индексном файле выглядит так:

Заголовок статьи со ссылкой на статью

ссылка на комментарии

Заголовок статьи со ссылкой на статью

ссылка на комментарии

Заголовок статьи со ссылкой на статью

ссылка на комментарии

...

То есть, вроде обычного блога.

Проблема в том, что нужно вывести количество комментариев к каждой статье, но не хочется делать sql-запрос на определение количества после каждого заголовка. На данный момент, я представляю себе такой механизм:

<?php

$sql ='SELECT * FROM статьи';

$result=mysql_query($sql);

while ($sql_ar=mysql_fetch_assoc($result)) {


echo 'Заголовок статьи';
$sql ='SELECT SQL_CALC_FOUND_ROWS id FROM комментарии WHERE id_статьи='.$sql_ar['id'];
$FOUND=mysql_query($sql);
$sql='SELECT FOUND_ROWS()';
$FOUND_ROWS=mysql_query($sql);
$комментариев=mysql_fetch_row($FOUND_ROWS);
echo 'Комментарии '.$комментариев;
mysql_free_result($FOUND_ROWS);

}

mysql_free_result($result);

?>

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

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

Supervisork что-то типа этого ?

SELECT А.id_статьи, А.заголовок, и тд..., count(Б.id_коментария)

FROM статьи А, коментарии Б

WHERE А.id_статьи = Б.id_статьи

N
На сайте с 06.05.2007
Offline
419
#2

только тут нужен GROUP BY:

SELECT А.id_статьи, А.заголовок, и тд..., count(Б.id_коментария)

FROM статьи А, коментарии Б

WHERE А.id_статьи = Б.id_статьи

GROUP BY A.id_статьи

Кнопка вызова админа ()
-
На сайте с 07.12.2005
Offline
97
-K-
#3

Для MySQL будет проще и быстрее сделать отдельный запрос на подсчет кол-ва комментариев для каждой записи.

А еще лучше в таблице статей хранить в отдельном поле кол-во комментариев и изменять его при удалении/добавлении комментария.

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

alexandr_nv и netwind, ваша идея вроде ясна, но если делать так, как предлогаете вы, нужно:

SELECT А.id_статьи AS id_st, А.заголовок AS z_st, и тд..., count(Б.id_коментария)...

тогда полученные данные нужно выгребать из массива $sql_ar как, например:

$sql_ar['id_st']

как получать значения count

(его тоже как AS делать?).

Не то, чтобы я совсем темный, но не хватает опыта.

-K- хранить количество комментов - идея по-своему хорошая. Но есть и недостатки. Я юзаю таблици миисам, а они не поддерживают транзакции. В результате количество, занесенное в поле может не соответствовать реальному.

Но быстродействие, конечно, подскакивает до предела.

И так, я все таки надеюсь получить исчерпывающий ответ о том, как это сделать без записи количества. Как получать значения count?

SC
На сайте с 02.05.2009
Offline
52
#5

SELECT a.*, COUNT(c.CommentID) FROM Articles a

JOIN Comments c ON a.ArticleID=c.ArticleID

GROUP BY a.*

Можете создать представление (вьюху)

CREATE VIEW viewArticles AS

тут запрос

а запрос будет выглядеть уже так: select * from viewArticles

Для более высокой производительности можно написать триггер, который будет делать инкремент (декремент) на поле счетчика. Но тут Вам на пальцах не объяснишь.

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

shareyourtrade.com, а как сделать, чтобы не на пальцах?

J
На сайте с 02.02.2009
Offline
53
#7

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

Всегда можно почитать в мануале :)

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

за мануал спасибо. Но я слаб в английском, так что, похоже. не смогу им воспользоваться. :(

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

J
На сайте с 02.02.2009
Offline
53
#9

CREATE TRIGGER testref BEFORE INSERT ON test1

FOR EACH ROW BEGIN

INSERT INTO test2 SET a2 = NEW.a1;

DELETE FROM test3 WHERE a3 = NEW.a1;

UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;

END;

Но играться с триггерами, плохо зная SQL - это минное поле

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

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

триггеры в MySQL могут создаваться только пользователем с привилегией SUPER, т.е. если Ваше приложение использует триггеры, то ни на одном, даже платном, хостинге оно работать не будет :(

События к которым можно привязывать триггеры в MySQL: INSERT, UPDATE, DELETE а мне-то нужен селект :(

12

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