Vielen Dank für die ausführliche Beschreibung! :)
Ich hatte allerdings scheinbar unüberwindbare Syntaxfehler ab allem nach ) rc
SELECT
p.page_namespace,
p.page_title,
p.page_is_redirect,
rc.rc_timestamp,
rc.rc_user,
rc.rc_user_text
FROM
page p
LEFT OUTER JOIN (
SELECT
rc_title,
rc_timestamp,
rc_user,
rc_user_text
FROM
recentchanges rc1
WHERE
rc1.rc_id = (
SELECT
MIN(rc2.rc_id)
FROM
recentchanges rc2
WHERE
rc2.rc_title = rc1.rc_title
)
) rc
WHERE page_is_redirect = 0 ...
Egal ob ich nun mit zB page_is_redirect oder p.page_is_redirect oder sogar rc.page_is_redirect fortfahre.
Generell kann und will ich die Tabellenstruktur nicht ändern. Es handelt sich um ein Wiki mit bereits 17.000 Artikeln.
Die Präfixe sind doch in Ordnung? Die Mediawiki Jungs haben sich sicher was dabei gedacht. title, user etc tauchen in vielen der knapp 50 Tabellen auf :) Zur Identifizierung also ganz hilfreich.
Du hast mich nicht verstanden. Speichere das Datum lieber in einer Spalte vom Datentyp DATE ab und selektiere nach dieser Datumsspalte.
Du meinst mit Datum doch mein ~~~sql
WHERE ... AND
(t1.page_title LIKE '%".$thismonth."%' OR t1.page_title LIKE '%".$lastmonth."%')
Das macht schon Sinn. Dass alle Titel mit YYYY-MM-DD anfangen hat aber mit der Query hier nichts zu tun. Stell dir vor die Titel lauten alle in der Art "2009-01-17 - Rolling Stones live in Hamburg". Diese Datumsangabe am Anfang ist keine solche. Sie hat mit dem rc\_timestamp (letztes Änderungsdatum) oder der rc\_id (ID der jeweiligen Änderung) nichts zu tun.
Die Anfrage dient einer Liste der letzten 50 ($this->limit) Artikel (aus Tabelle page) deren Inhalt immer (auch in Zukunft) aus den letzten 2 Monaten stammt (YYYY-MM-DD am Anfang), was das "Titel like lastmonth (z.Z. = 2009-01) or thismonth (z.Z. = 2009-02)" gewährleistet und neue Artikel, die sich zB um 1999 drehen, ausfiltert.
Was ist mit nachfolgender Variation? Sie ergibt zwar keine Syntax fehler, beinhaltet aber noch immer die title-Doppelungen aus recentchanges.
~~~sql
SELECT
t1.page_namespace,
t1.page_title,
t1.page_is_redirect,
t2.rc_timestamp,
t2.rc_user,
t2.rc_user_text
FROM page AS t1 INNER JOIN recentchanges AS t2
ON t1.page_title = t2.rc_title
AND t2.rc_id IN (
SELECT mySub.id FROM
(
SELECT
rc_timestamp, rc_title, rc_user, rc_user_text, MIN(rc_id) AS id
FROM
recentchanges AS t3
GROUP BY
rc_timestamp, rc_title, rc_user, rc_user_text
) AS mySub
)