[mysql] Podział dat na dekady

Dziś potrze­bo­wa­łem wycią­gnąć z bazy danych WordPress'a rekor­dy poukła­da­ne wg daty, a dokład­nie pogru­po­wa­ne wg dekad (1960 – 1969, 1970 – 1979…). Pętlą się tego nie da zrobić więc trzeba było stworzyć zapyta­nie. Najle­piej jedno by nie obcią­żać syste­mu. Data zapisa­na jest w metada­nych postu pod nazwą 'data', a typ postu to 'plyty'.

Zapytanie

select (FLOOR(`wp_postmeta`.`meta_value`/10)*10) as `dekada`, COUNT(`wp_postmeta`.`meta_value`) as `ile`
FROM `wp_posts` INNER JOIN `wp_postmeta` ON `wp_posts`.`ID` = `wp_postmeta`.`post_id`
WHERE 1=1
AND `wp_postmeta`.`meta_key` = 'data'
AND `wp_posts`.`post_type` = 'plyty'
GROUP BY FLOOR(`wp_postmeta`.`meta_value`/10)*10

Omówienie

Sposo­by, które znala­złem w sieci były jakieś zagma­twa­ne. Jedyne co mi pomogło to znale­zio­ny zapis grupo­wa­nia z funkcją FLOOR, czyli zaokrą­gla­nia w dół daty. Jeżeli podzie­li­my rok 1964 przez 10, to wyjdzie nam 196,4. Po zaokrą­gle­niu w dół mamy 196. Pomno­ży­my przez 10 i mamy począ­tek dekady, tj 1960. Wystar­czy zasto­so­wać ten trik w sekcji SELECT i GROUP BY i gotowe. Za oblicze­nie wystą­pień w dekadzie służy funkcja COUNT do której jako argument trafia wartość pola `meta_​value` bez modyfi­ka­cji. Dla upięk­sze­nia wyników zasto­so­wa­łem modyfi­ka­tor 'as'.

Wynik

dekada ile
0 8
1960 214
1970 324
1980 484
1990 2137
2000 4224
2010 3141

Jakby ktoś spytał skąd wartość 0, to odpowia­da, że nie wszyst­kie płyty mają podaną datę wydania. W tym przypad­ku 8 płyt ma przypi­sa­ną wartość 0. Dodat­ko­wo nie trzeba się martwić o sorto­wa­nie, bo wynik został posor­to­wa­ny automa­tycz­nie.

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.