2009-07-16 44 views
0

使用PHP和MySQL,我将一个网站与基于MediaWiki的wiki进行整合,以便该网站中的用户资料具有关于他们在wiki中的贡献的一些统计信息。MediaWiki:如何获取用户编辑过的最后N篇文章?

我想说明最后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数据库方案(它是相当自动复制),你可以看看它here

回答

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 
+0

我现在看到我的错误。再来一次,如果它看起来太复杂了,它是错误的:) 显然,每个'rev_id'与表中的另一个不同,所以它会随机选取一个并导致问题。我不会考虑以这种方式使用ORDER!完美解决方案 – 2009-07-16 15:44:06

0

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

,那么你可以:

... ORDER BY r.date DESC ... 
+0

哎呀,对不起,那是从一些测试中,我在做:) 现在一个错字,我使用 ... ORDER BY r.rev_timestamp ... 但结果相同,所以看起来不像是由此造成的问题。 – 2009-07-16 15:30:19

相关问题