2009-07-16 62 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

相關問題