SQL для выбора TОП5 в OG по количеству участников

Главные вкладки

Аватар пользователя andriy.olischuk andriy.olischuk 26 мая 2009 в 17:01

Задача: создать блок, в котором вывести ТОП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

Комментарии

Аватар пользователя elia elia 26 мая 2009 в 21:35

А зачем вложенные селекты? Лишняя нагрузка на сервер...

Вот пример похожего запроса - nodes с кол-вом комментариев к ним отсортированные по дате создания по убывающей:

SELECT
    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