ויקיפדיה:מאמרים שנערכו מעט/יצירת הרשימה

רשימת הפרמטרים ליצירת הרשימה הולכת ומתארכת, וביחד איתה גם מורכבות השאילתה, וההכנות הנדרשות כדי להפעיל אותה. לכן החלטתי לרכז כאן את המידע הנחוץ לטובת יצירת הרשימה - בעיקר כדי שיהיה לי יותר קל למצא את הדברים בפעם הבאה שהרשימה תדרוש עדכון - אבל גם לטובת אחרים שירצו ליצור את הרשימה בעצמם.

הטבלאות הדרושות הן -

  • page
  • templatelinks
  • categorylinks
  • revisions

מכיוון שטבלת revisions לא זמינה בפורמט sql נצטרך לחלץ אותה מתוך ה-xml באמצעות Xml2sql.

עכשיו נסיר את כל העריכות שבוצעו על ידי בוטים (רשימת משתמשים עם דגל בוט). באמצעות פקודה כזו -

 delete from revision where rev_user_text in ( .....);

(אנקדוטה - נכון ל5/6/2007 בוצעו בויקיפדיה 407,006 עריכות על ידי משתמשים בעלי דגל בוט!)

ניצור טבלה נוספת שתרכז את מספר העריכות שבוצעו בכל ערך -

   create table num_of_edits( p_id int not null, PRIMARY KEY(p_id), num int);
 insert into num_of_edits(p_id,num) select rev_page, count(*) from revision group by rev_page;

ניצור טבלה נוספת שתרכז את מספר השחזורים שבוצעו בכל ערך -

   create table rollbacks( p_id int not null, PRIMARY KEY(p_id), num int);
insert into rollbacks(p_id,num) select rev_page, count(*) from revision where (rev_comment REGEXP "^שחזור") or (rev_comment REGEXP "^שוחזר") or (rev_comment REGEXP "^ביטול גרס")  group by rev_page;5

נוסיף עמודה חדשה לטבלת page ונכניס אליה את מספר הערכיכות פחות מספר השחזורים בכל ערך.

ALTER TABLE page ADD num_of_edits INT;
update page, num_of_edits  set num_of_edits=num where page_id=p_id;
 update page, rollbacks  set num_of_edits=(num_of_edits-(num*2)) where page_id=p_id;

לצורך ריכוז מספר העורכים נמחק את כל הגרסאות שבהן בוצע שחזור

delete from revision where (rev_comment REGEXP "^שחזור") or (rev_comment REGEXP "^שוחזר") or (rev_comment REGEXP "^ביטול גרס");

ניצור טבלה חדשה שתרכז את מספר העורכים השונים של כל ערך (אנונימיים שונים נספרים כעורך יחיד) -

   create table num_of_editors( p_id int not null, PRIMARY KEY(p_id), num int);
 insert into num_of_editors(p_id,num) select rev_page, count(DISTINCT rev_user) from revision group by rev_page;

נוסיף עמודה חדשה לטבלת page ונכניס אליה את מספר העורכים עבור כל ערך-

ALTER TABLE page ADD num_of_editors INT;
update page, num_of_editors  set num_of_editors=num where page_id=p_id;

בטבלה נוספת נרכז את זמן העריכה הראשונה והאחרונה של כל ערך, ובנוסף את המשתמש הראשון שערך אותו -

create table edits(p_id int not null, PRIMARY KEY(p_id), first VARCHAR(16), last VARCHAR(16), first_by int);
insert into edits(p_id,first,last) select rev_page, min(rev_timestamp), max(rev_timestamp) from revision group by rev_page;
update revision, edits set first_by=rev_user where rev_page=p_id and rev_timestamp=first;

נוסיף את המידע לתוך טבלת page -

ALTER TABLE page ADD page_last_edit INT;
ALTER TABLE page ADD page_first_by INT;
update page, edits set page_last_edit=last, page_first_by=first_by where page_id=p_id;

ואחרי שבילינו יום וחצי בהמרות והכנות למיניהן הגיע הזמן לשאילתה האמיתית (והאימתנית) -

select page_title from page where
page_namespace=0 and
num_of_edits<7 and
num_of_editors<4 and
page_is_redirect=0 and
page_id not in 
(select DISTINCT tl_from from templatelinks where 
tl_title="לשכתוב" or
tl_title="עריכה" or
tl_title="נ" or
tl_title="פירושונים" or
tl_title="בבדיקה" or
tl_title="פשט" or
tl_title="איחוד" or
tl_title="מחלוקת"
) and
page_id not in (select DISTINCT cl_from from categorylinks where cl_to="ימות השנה")
and not (page_title<2008 and page_title>0) and 
page_last_edit<"20070505000000" and
page_first_by<>4116
order by page_title;
  • לזכור לשנות ידנית כל פעם שמעדכנים בסיס נתונים!'
  • הוסרו רק ערכי שנים בין 0 ל2007 - אם היו לכולן קטגוריה או תבנית קבועה זה היה קל יותר...
  • כדי לקבל את רשימת הערכים של דרור יש להחליף "שונה מ" בשווה בשורה לפני האחרונה.