@EVOSandru6

Как в postgres выполнить сортировку по вычислению разницы даты из разных таблиц при условии, что связь есть?

Добрый день.

Я хочу сделать сортировку отделов по времени реагирования комментирования на привязанные к ним форумы:.

Таблицы:

m_departments
-------------------
id
name

m_forums
-------------------
id
date_create_stamp (int)
department_id

mc_comments_forums
-------------------
id
date_create_stamp (int)
forum_id

что то проде того:

SELECT "m_departments".id, "m_departments".name, 
floor((sum(mc_comments_forums.date_create_stamp - m_forums.date_update_stamp) / count(m_forums)) / 3600)
AS total
FROM "m_departments" 
LEFT JOIN m_forums 
ON "m_departments".id = m_forums.departmsent_id
LEFT JOIN mc_comments_forums 
ON m_forums.id = mc_comments_forums.forum_id


Проблемы:

1) в Where - как сделать, чтобы вычисление:

floor((sum(mc_comments_forums.date_create_stamp - m_forums.date_update_stamp) / count(m_forums)) / 3600)


Производилось только для связей, если они есть (not null или как то еще).

2. Чтобы вычисление

floor((sum(mc_comments_forums.date_create_stamp - m_forums.date_update_stamp) / count(m_forums)) / 3600)


производилось с саммым ранним оставленным для форума комментарием.

Помимо этого - насколько правильный запрос?

Буду благодарен за любую помощь.
  • Вопрос задан
  • 750 просмотров
Пригласить эксперта
Ответы на вопрос 1
@grinat
1. Заменить jeft join на inner join
2. Не полнял что нужно, но такто: floor((sum(mc_comments_forums.date_create_stamp - (SELECT m_forums.date_update_stamp order by m_forums.date_update_stamp LIMIT 1) / count(m_forums)) / 3600). Если вообще только для одного коммента это надо, не мучай бд, разбей на два запроса.

Как по мне любой запрос, внутри которого есть count, полное гуано, когда записей мало, они норм работают, когда много, все, конец. Да и такие запросы если только эт не нужно для сортировки, лучше вообще не использовать, а заменить их на несколько отдельных запросов, тогда их легко кэшировать, сразу видны проблемные места и т.п.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы