2011-12-20 1 views
1

Я столкнулся это (для меня по крайней мере) вызова:Рассчитайте среднее время между почтой и первым комментарием в двух таблицах MySQL

У меня есть форум, где сообщения хранятся в таблице posts и комментариях в таблице comments. Когда сообщение создается, отметка времени хранится в столбце INT (11) posts.created_at. То же самое с комментарием ... когда комментарий сделан, с комментарием отметка времени хранится в comments.created_at.

Однако теперь я хотел бы узнать среднее время в секундах, которое требуется для получения первого комментария. Конечно, когда дается комментарий NO, это не следует воспринимать в среднем.

Это можно сделать в одном запросе SQL? Если нет, как это можно сделать с наименьшим количеством запросов?

Надеюсь, у вас есть идея, как и я.

ответ

1

Надеемся, что это будет работать для вас:

select avg(first_comments.first_time - posts.created_at) 
from  posts 
join (select comments.post_id 
        min(comments.created_at) as first_time 
     from  comments 
     group by post_id) as first_comments 
on  first_comments.post_id = posts.id; 
+0

Это сделало трюк! Благодаря!! – Glooh

1

Если вы используете тип даты для полей даты, то что-то вроде:

SELECT AVG(
      DATEDIFF(MIN(comments.created_at), posts.created_at) 
     ) 
FROM posts 
INNER JOIN comments on comments.post_primary_key = posts.primary_key 

вы должны получить то, что вам нужно

Но, как было отмечено в комментариях, вы не, хранящую даты как даты, с учетом этого попробуйте:

SELECT AVG(
      MIN(comments.created_at) - posts.created_at 
     ) 
FROM posts 
INNER JOIN comments on comments.post_primary_key = posts.primary_key 

Для полноты - мое последнее предложение ... Вы можете попробовать это:

SELECT AVG(sub.timeToComment) 
FROM ( 
     SELECT MIN(comments.created_at) - posts.created_at as timeToComment 
     FROM posts 
     INNER JOIN comments on comments.post_primary_key = posts.primary_key 
    ) as sub 

Но не уверен, что это сильно отличается от подхода @Xophmeister

+0

Спасибо! Я собираюсь проверить это! Действительно, я сохраняю числа как временные метки. Думаю, что быстрее будет рассчитывать, чем DATEDIFF? – Glooh

+0

Не уверенный быть честным - тип даты, вероятно, хранится как длинный под всеми обертками в любом случае, и 'датифик', вероятно, использует этот факт, и так будет схожие скорости, столбцы даты просто дают вам некоторые удобные функции без каста или конвертируя все время. –

+0

Нет() слишком много? Не будьте придирчивы, но чтобы понять. – Glooh

1
select posts.id, 
     avg(comments.created_at - posts.created_at) 
from  posts 
join  comments 
on  comments.id = posts.id 
group by posts.id; 

Это предполагает, что MySQL будет правильно обрабатывать DATETIME арифметику.

EDIT Как отмечает @MattFellows, этот запрос неверен, поскольку он группируется по почте; принимаю ли я min(comments.created_at), или нет. В самом деле, результат, который он вернет, полностью избыточен: с min, это будет время между каждым сообщением и его первым комментарием; без min, это среднее время между штырем и все замечания (что является довольно поддельной метрика!) ... Я вешаю свою голову в позоре: P

Правильный запрос:

select avg(min(comments.created_at) - posts.created_at) 
from posts 
join comments 
on  comments.id = posts.id; 

Хотя, опять же, это временные метки являются числовыми, а не datetime, которые (по-видимому) MySQL не имеют перегруженных операторов.

+0

Существует функция DATEDIFF для арифметики дат, и это не даст общего среднего значения. На самом деле это даже не ограничивает первый комментарий в соответствии с запросом. –

+0

DATEDIFF используется для вычитания двух дат, но Glooh по какой-то причине экономит время в INT (11). Хотя ваш второй пункт действителен. @MattFellows – Zohaib

+0

@MattFellows Я пропустил 'мин' на момент создания комментария: исправлено. Не знал о «датиффе». – Xophmeister

 Смежные вопросы

  • Нет связанных вопросов^_^