MediaWiki: как получить последние N отредактированных статей пользователем? - PullRequest
0 голосов
/ 16 июля 2009

Используя PHP и MySQL, я интегрирую сайт с вики, основанной на MediaWiki, так что профили пользователей на сайте имеют некоторую статистику об их вкладе в вики.

Я хочу показать последние 3 отредактированные статьи пользователя в пространстве имен (основное, id 0), без повторения и ссылки на них .

Для этого я делаю более или менее следующее:

// getting the article IDs
$db->query("SELECT DISTINCT rev_page
        FROM revision r, page p
        WHERE r.rev_page = p.page_id
            AND p.page_namespace = 0
            AND rev_user = {$userId}
        ORDER BY r.rev_timestamp DESC
        LIMIT 3");
// then the IDs are stored in $last_edited_ids...

// getting the names of the articles
$db->query("SELECT page_title
        FROM page WHERE page_id
        IN (" . implode($last_edited_ids, ',') . ")");

Проблема в том, что я не уверен, что это правильно, хотя он работает большую часть времени : для некоторых пользователей старая статья отображается как последняя отредактированная, но 2-й и 3-й результаты верны , Это заставляет меня думать, что я, должно быть, делаю что-то не так, но SQL не моя сильная сторона ...

Подсказка: если вы не знаете схему базы данных MediaWiki (она довольно автообъяснительна), вы можете посмотреть ее здесь .

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Предложение "DISTINCT rev_page" отбрасывает ваш SQL. Он применяет DISTINCT ко всем rev_page (page.page_id), поэтому он получает случайный rev_id для каждой страницы.

Попробуйте этот запрос, который объединяет два ваших запроса в один:

SELECT DISTINCT p.page_title
FROM revision r, page p
WHERE r.rev_page = p.page_id
AND p.page_namespace = 0
AND rev_user = {$userId}
GROUP by p.page_title
ORDER BY MAX(r.rev_id) DESC
LIMIT 3
0 голосов
/ 16 июля 2009

Я не знаком с реализацией MediaWiki, но я думаю вам следует ORDER BY нечто иное, чем rev_id. Может быть, нет гарантии, что идентификаторы будут назначены в хронологическом порядке. Нет ли какого-нибудь поля date в таблице revision?

Тогда вы могли бы:

... ORDER BY r.date DESC ...
...