2009-04-11 4 views
1

Ich habe 1 Tabelle mit Artikeln gefüllt. Für den Zweck dieses Posts, sagen wir einfach, es hat 4 Felder. story_id, story_title, story_numyes, story_numnoWas ist der beste Weg, zeitbasierte Sortierung in PHP/MySQL zu implementieren?

Jeder Artikel kann mit JA oder NEIN gewählt werden. Ich speichere jede Bewertung in einer anderen Tabelle, die 3 Felder enthält: vote_storyid, vote_date (als Zeitstempel), vote_code (1 = ja, 0 = nein).

Wenn also jemand in einem Artikel "Ja" wählt, führt er eine Aktualisierungsabfrage nach story_numyes + 1 sowie eine Einfügeabfrage durch, um die Story-ID, das Datum und den vote_code in der zweiten Tabelle zu protokollieren.

Ich möchte Artikel basierend darauf sortieren, wie viele JA oder NEIN Stimmen es hat. Für "Bester aller Zeiten" ist die Bewertung offensichtlich einfach ... ORDER BY story_numyes DESC.

Aber wie würde ich heute, diese Woche, diesen Monat, die besten/schlechtesten Artikel machen?

bekomme ich die Zeitstempel, die Stichtag für jeden Zeitraum über folgende markieren:

$yesterday= strtotime("yesterday"); 
$last_week = strtotime("last week"); 
$last_month = strtotime("last month"); 

Aber Ich bin nicht sicher, wie diese Zeitstempel in einer MySQL-Abfrage zu verwenden, um die gewünschten Ergebnisse zu erzielen.

Antwort

3

Probieren Sie etwas wie

SELECT id,
SUM (CASE WHEN votedate> = $ gestern THEN 1 ELSE 0 END) AS daycount,
SUM (CASE WHEN votedate> = $ LAST_WEEK THEN 1 ELSE 0 END) AS weekcount,
SUM (1) AS monthcount
VON Stimmen
WHERE yes_no = 'YES'
UND votedate> = $ last_month
GROUP BY-ID

Dann machen Sie das eine Unterabfrage und Sie können die maximalen Werte für die Zählungen erhalten.

(Bitte unter Berücksichtigung der üblichen Syntax Schlamperei in einer ungeprüften Abfrage inhärent.)


Als Reaktion auf die Kommentare:

Um es als eine effiziente Unterabfrage zu verwenden (dh nicht korreliert) zu erhalten die Maximalwerte:

SELECT
mAX (daycount) AS MaxDayCount,
mAX (Woche count) AS MaxWeekCount,
MAX (monthcount) AS MaxMonthCount
VON
(
.... all das Zeug ...
) AS qcounts

aber natürlich kann man nicht zuschreiben sie zu IDs, weil sie anders sind.Wenn Sie wollen, dass sie einer nach dem anderen mit ids, können Sie

SELECT id, monthcount
VON
(
.... all das Zeug ...
) AS qcounts
ORDER BY monthcount DESC
LIMIT 1

und tun es dreimal, einmal für Tag/Woche/Monat.

Hinweis: Dies ist alles, um einige Dinge zu veranschaulichen, die Sie in einer einzelnen, einigermaßen effizienten Abfrage erreichen könnten. Ich wäre nicht überrascht, wenn Sie es am einfachsten (und einfach == gut) finden würden, es zu brechen, wie andere vorschlagen.

+0

Ich versuche, mich von Unterabfragen fernzuhalten, um die CPU-Last zu minimieren. Keine Möglichkeit, dies in einem Schritt zu tun? –

+0

Die Art der Unterabfrage, von der Sie sich fernhalten möchten, ist eine korrelierte Unterabfrage, was dies nicht ist. Aber sicher, Sie können einfach ORDER BY setzen, indem Sie DESC am Ende zählen. Aber Sie können nur eine als primäre Reihenfolge wählen. – dkretz

+0

Und wenn Sie "All time" möchten, dann müssen Sie die Monatszahl mit CASE verlängern und die Datumsbeschränkung im WHERE entfernen (was sehr teuer sein wird). – dkretz

2

Allgemein gilt:

select story_id, sum(vote_code) 
from story_vote 
group by story_id; 

Für besondere Abstimmung Datumsbereiche:

select story_id, sum(vote_code) 
from story_vote 
where vote_date >= 'least date, inclusive' 
and vote_date < 'last date, exclusive' 
group by story_id; 

OP Kommentare:

Wie würde ich die ORDER BY-Klausel verwenden?

Sie würden eine order by sum(vote_code) hinzufügen. Absteigend, wenn Sie Geschichten mit den meisten Stimmen wollen zuerst:

order by sum(vote_code) desc; 

Auf edit: ich bemerke, dass er alle Geschichten will, nicht ein, so dass ich das Entfernen der having-Klausel.

+0

Wie würde ich die ORDER BY-Klausel verwenden? –

0
SELECT a.*, SUM(vote_code) AS votes 
FROM articles a JOIN votes v ON (a.story_id = v.vote_storyid) 
WHERE v.vote_date >= $yesterday 
GROUP BY a.story_id 
ORDER BY 2 DESC; 

Ebenso für $last_week und $last_month.

Wenn Sie möchten, dass die Ergebnisse sortiert werden, ist es besser, dies in separaten Abfragen zu tun, anstatt es in einer einzigen Abfrage zu versuchen. Weil die Sortierreihenfolge für jede der drei Perioden sehr unterschiedlich sein kann.

Verwandte Themen