Dziś potrzebowałem wyciągnąć z bazy danych WordPress'a rekordy poukładane wg daty, a dokładnie pogrupowane wg dekad (1960 – 1969, 1970 – 1979…). Pętlą się tego nie da zrobić więc trzeba było stworzyć zapytanie. Najlepiej jedno by nie obciążać systemu. Data zapisana jest w metadanych 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
Sposoby, które znalazłem w sieci były jakieś zagmatwane. Jedyne co mi pomogło to znaleziony zapis grupowania z funkcją FLOOR, czyli zaokrąglania w dół daty. Jeżeli podzielimy rok 1964 przez 10, to wyjdzie nam 196,4. Po zaokrągleniu w dół mamy 196. Pomnożymy przez 10 i mamy początek dekady, tj 1960. Wystarczy zastosować ten trik w sekcji SELECT i GROUP BY i gotowe. Za obliczenie wystąpień w dekadzie służy funkcja COUNT do której jako argument trafia wartość pola `meta_value` bez modyfikacji. Dla upiększenia wyników zastosowałem modyfikator '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 odpowiada, że nie wszystkie płyty mają podaną datę wydania. W tym przypadku 8 płyt ma przypisaną wartość 0. Dodatkowo nie trzeba się martwić o sortowanie, bo wynik został posortowany automatycznie.