Подскажите, как правильней и лучше и менее "травмотично" ?

bovkun

Новичок
Подскажите, как правильней и лучше и менее "травмотично" ?

Подскажите, как правильней и лучше и менее "травмотично" ?

При каждой загрузке каждой страницы сайта нужно подсчитывать количество объявлений зашедшего пользователя (если он опознан). Т.е. нужно узнавать каждый раз общее кол-во его объявлений.

Какой вариант использовать?
Или может лучше по другому поступать?

PHP:
// Вариант 1
$total = mysql_num_rows(mysql_query("
SELECT user_id FROM adv_flats_sale WHERE ... "));

// Вариант 2
$row_Recordset = mysql_fetch_assoc(mysql_query("
SELECT count(user_id) AS user_id FROM adv_flats_sale WHERE ... "));
$total = $row_Recordset['user_id'];

// Вариант 3
$total = mysql_result(mysql_query("
SELECT count(user_id) AS user_id FROM adv_flats_sale WHERE ... "), 0, "user_id");
 

Demiurg

Guest
первому варианту отказать. второй или третий по вкусу.
 

Дмитрий Попов

Guest
Ничего не понял... Если я правильно понимаю, то в базе есть сущность - пользователь. И сущность - объявление.
Вам надо посчитать количество объявлений которые добавил пользователь....
Тогда абсолютно непонятно, зачем нужен второй и третий запросы, которые будут возвращать всегда единицу (если userid - id этого пользователя), а первый - просто неправилен с точки зрения идеологии SQL.

Если я понял правильно, то Вам надо считать сount('ID объявления').
Если я понял не правильно - поясните задачу.
 

bovkun

Новичок
Дмитрий Попов
Как раз таки нет. Во всех случаях возвращается одинаковое число.

Нужно подсчетать кол-во объявлений пользователя.

Demiurg
Спасибо!
 

Falc

Новичок
bovkun
Для быстроты и просто удобства лучше:
SELECT count(*) AS user_id FROM adv_flats_sale WHERE ...

Дмитрий Попов
если user_id не может быть NULL то:
сount('ID объявления') = count(user_id)
 

Дмитрий Попов

Guest
bovkun,Falc:
Да, проверил, и обнаружил для себя сей факт...
Просто у меня в голове count, автоматически ассоцицируется с Distinct.

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

Прошу прощения за оффтоп, можно его не развивать, все Вышесказанное сугубо моё ИМХО.
 

Falc

Новичок
Дмитрий Попов
>>Но вообще, все-таки я рекомендовал бы считать именно ID объявления, хотя бы для удобочитаемости запроса.

"для удобочитаемости запроса" лучше использовать COUNT(*), который в некоторых случаех еще может и увеличить скорость запроса в несколько раз.
 

Дмитрий Попов

Guest
Falc
Тут я, безусловно, согласен.
 

Falc

Новичок
Для тех, кому интересно почему COUNT(*), обычно быстрее того же COUNT(id), поясню на примере:

Есть таблица message: id | user_id | text
с индексом PRIMARY(id), INDEX(user_id)
Нам надо подсчитать сообщения пользователя с заданым $user_id
Сравним 2 запроса
SELECT COUNT(*) FROM message WHERE user_id = $user_id
и
SELECT COUNT(id) FROM message WHERE user_id = $user_id

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

Для выполнения второго запроса мы сначало проходым по индексу, для отбора записей удовлетворяющих условию, после чего если запись поподает под условие, то вытаскиваем ее (запись скорее всего будет на диске) чтобы получить значение id и только потом инкриментим счетчик.

В итоге получаем что при большом кол-ве записей скорость первого запроса быдет выше в разы.
 

chira

Новичок
я бы посоветовал еще один вариант:
в таблице юзеров добавить поле adv_flats_sale_count и заполнять его при посте объявления юзером.
тогда не нужно будет каждый раз пересчитывать количество объявлений...
 
Сверху