Используя 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 (она довольно автоинформативная), вы можете посмотреть на нее здесь.
Предложение 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
Я не знаком с реализацией MediaWiki, но я угадал, вам нужно ORDER BY
что-то еще, чем rev_id
. Возможно, нет гарантии, что идентификаторы должны быть назначены в хронологическом порядке. Не существует ли какое-либо поле date
в таблице revision
?
Тогда вы могли бы:
... ORDER BY r.date DESC ...