Я даже не уверен, что это можно сделать эффективно, но вот моя проблема:
Я пишу то, что по сути является движком блога, где можно пометить сообщение в блоге и все ответы на каждое сообщение в блоге.
Итак, я мог бы иметь запись в блоге с тегом «стек» и ответ на этот пост с тегом «переполнение».
Прямо сейчас я пытаюсь создать список самых популярных тегов, когда пользователь нажимает на специальную страницу в моем приложении. Он должен возвращать не только n самых популярных тегов по убыванию количества сообщений в блоге, но также количество сообщений в блогах, связанных с каждым тегом, , даже если ответ в этом сообщении, но не само сообщение помечен этим тегом .
Таким образом, если BlogPost A помечен как «foo», а ответ в BlogPost B помечен как «foo», общее резюме популярных тегов должно учитываться как всего два сообщения в блоге, хотя BlogPost B технически не помечен .
Вот описание таблиц / полей, которые могут иметь отношение:
BlogPosts
| id # Primary key for all tables, Rails-style
BlogComments
| id
| blog_post_id
Tags
| id
| name # 'foo'
Taggings
| id
| tag_id
| blog_post_id
| blog_comment_id
Существует некоторая денормализация в Taggings для удобства. Если кто-то помечает BlogPost, он заполняет поле blog_post_id, а blog_comment_id остается NULL. Если кто-то помечает комментарий к сообщению, он заполняет как blog_post_id, так и blog_comment_id.
Есть ли способ вернуть отсортированный список самых популярных тегов в одном или нескольких запросах SQL? Я думаю, что мне может понадобиться просто запускать вычислительно-дорогостоящий скрипт каждые несколько минут в задании cron и выводить кэшированный вывод вместо того, чтобы запускать его каждый раз, когда кто-то попадает на страницу ...
Спасибо!