MediaWiki: как получить последние N отредактированных статей пользователем?

0

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

Я хочу показать последние 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, ',') . ")");

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

Совет. Если вы не знаете схему базы данных MediaWiki (она довольно автоинформативная), вы можете посмотреть на нее здесь.

Теги:
mediawiki

2 ответа

1
Лучший ответ

Предложение 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
    Теперь я вижу свою ошибку. Еще раз, если это выглядит слишком сложно, это неправильно :) Очевидно, что каждый 'rev_id' отличался от другого в таблице, поэтому он выбирал один случайным образом и вызывал проблемы. Я бы не подумал об использовании ORDER таким образом! Идеальное решение!
0

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

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

... ORDER BY r.date DESC ...
  • 0
    Ой, извините, это была опечатка из некоторых тестов, которые я проводил :) Сейчас я использую ... ORDER BY r.rev_timestamp ... но результаты такие же, так что это не похоже на проблему, вызванную это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню