0

使用 PHP 和 MySQL,我正在将一个站点与基于 MediaWiki 的 wiki 集成,以便站点中用户的个人资料有一些关于他们在 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 数据库方案(它相当自动解释),您可以在这里查看

4

2 回答 2

1

“DISTINCT rev_page”子句使您的 SQL 失效。它将 DISTINCT 应​​用于所有 rev_page(page.page_id's),因此每页将获得一个随机 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
于 2009-07-16T15:32:45.130 回答
0

我不熟悉 MediaWiki 的实现,但我你应该ORDER BYrev_id. 也许不能保证按时间顺序分配 ID。表中没有某种date字段revision吗?

然后你可以:

... ORDER BY r.date DESC ...
于 2009-07-16T15:13:21.363 回答