使用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数据库方案(它是相当自动重复的),您可以查看它here。
答案 0 :(得分: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
答案 1 :(得分:0)
我不熟悉MediaWiki的实现,但我猜测你应该ORDER BY
除rev_id
以外的其他内容。也许不能保证按时间顺序分配ID。 date
表中是否存在某种revision
字段?
然后你可以:
... ORDER BY r.date DESC ...