Задача: создать блок, в котором вывести ТОП5 групп (OG.module) по количеству участников.
Решение: Начал я конечно со Views. То ли не хватило моих знаний, то ли ещё чего, но выставить критерием сортировки количество участников группы - ну никак не вышло. По количеству комментариев - пожалуйста, а по пользователям - не нашёл как. Стандартных модулей/блоков не нашёл так же. Тогда решил написать небольшой модуль-блок сам.
OG устроены так, что группа создаётся как обычная нода в таблице {node}, а её частные данные хранятся в таблице {og} (к примеру описание группы, язык и т.п.). При этом, пользователи к группе привязываются в третьей таблице {og_uid}. Соответственно, обычным запросом с сортировкой групп в порядке убывания числа участников - COUNT(uid) по {og_uid} - вытащить список групп сложно.
Решилось запросом следующего вида:
SELECT (SELECT COUNT(og_uid.uid) FROM og_uid WHERE og_uid.nid = og.nid) AS cnt, og.*, node.* FROM og, node WHERE og.nid = node.nid ORDER BY cnt DESC LIMIT 0,5
В моём случае сайт на нескольких языках, поэтому потребовалось учесть фильтрацию по текущему языку:
SELECT (SELECT COUNT(og_uid.uid) FROM og_uid WHERE og_uid.nid = og.nid) AS cnt, og.*, node.* FROM og, node WHERE og.nid = node.nid AND og.og_language = '$language->language' ORDER BY cnt DESC LIMIT 0,5
Комментарии
А зачем вложенные селекты? Лишняя нагрузка на сервер...
Вот пример похожего запроса - nodes с кол-вом комментариев к ним отсортированные по дате создания по убывающей:
n.nid,
n.`created`,
n.`title`,
COUNT(c.`cid`) AS comments
FROM
`dr_node` n,
`dr_comments` c
WHERE
c.`nid` = n.`nid`
GROUP BY
n.`nid`,
n.`created`
ORDER BY
n.`created` DESC