Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: suma rekordów z każdego miesiąca
Forum PHP.pl > Forum > Bazy danych > MySQL
yaro
Witam

Mam dwie tabele, jedna z newsami, druga z artykułami. Wyświetlam newsy razem z artykułami posortowane wg. daty, to mi działa bez zarzutów. Chcę teraz zrobić listę miesięcy i przy miesiącach umieścić ile w danym miesiącu zostało dodanych artykułów i newsów (razem je licząc)

listopad(5)
październik(2)

Te tabele się troche różnią, ale z tym sobie poradziłem, niestety to nie chce mi wyjść.
  1. SELECT DISTINCT DATE_FORMAT(dat,'%M') AS m FROM news GROUP BY m UNION SELECT DISTINCT DATE_FORMAT(dat,'%M') AS m FROM articles GROUP BY m ORDER BY m

W zapytaniu powyżej wyświetla mi prawidłowo miesiące (bez powtórzeń), ale nie jestem wstanie uzyskać sumy

  1. SELECT DISTINCT id, count(DISTINCT id) AS ile, DATE_FORMAT(dat,'%M') AS m FROM news GROUP BY m UNION SELECT DISTINCT id, count(DISTINCT id) AS ile, DATE_FORMAT(dat,'%M') AS m FROM articles GROUP BY m ORDER BY id

Tutaj uzyskuje miesiące z liczbą wpisów, jednak miesiace powtarzają się.

Nie mam już pomysłów jakby to zrobić sad.gif
Norbas
Możesz spróbować:
  1. SELECT COUNT(id) AS i, DATE_FORMAT(dat ,'%m') AS m
  2. FROM news GROUP BY m
  3. UNION ALL
  4. SELECT COUNT(id) AS i, DATE_FORMAT(dat , '%m') AS m
  5. FROM articles GROUP BY m
yaro
Niestety nie działa jakbym chciał, daje rezultat taki sam jak ten drugi kod, który przedstawiłem sad.gif

Jeszcze jakieś pomysły?
Norbas
Stwórz tabelę 'miesiace' i zastosuj zapytanie:
  1. SELECT miesiac, COUNT(news.id) + COUNT(articles.id)
  2. FROM miesiace LEFT JOIN articles ON month(articles.dat) = miesiac
  3. LEFT JOIN news ON month(news.dat) = miesiac
  4. GROUP BY miesiac
yaro
Już prawie dobrze smile.gif

Poprawiłem trosze, bo nie działało, ale teraz wyświetla mi wszystkie miesiące (ale myśle że to jeszcze nie problem) tylko że do listopada zlicza 12 wpisów a jest łącznie 5.

  1. SELECT miesiac, COUNT(news.id) + COUNT(articles.id)
  2. FROM miesiace LEFT JOIN articles ON month(articles.dat) = miesiace.id
  3. LEFT JOIN news ON month(news.dat) = miesiace.id
  4. GROUP BY miesiac


Proszę jeszcze o pomoc
Norbas
Jeśli utworzyłeś tabelę 'miesiace' o jednym polu id, którego wartością jest numer miesiąca, to grupowanie wg miesiace.id:
  1. ... GROUP BY miesiace.id
yaro
To i tak nic nie daje sad.gif

Jak zmieniłem LEFT JOIN na RIGHT to wyświetla tylko miesiące w których są wpisy

Zrzuty tabel zamieściłem na http://phpfi.com/188185
Norbas
  1. SELECT miesiac, COUNT(DISTINCT news.id) + COUNT(DISTINCT articles.id)
  2. FROM miesiace LEFT JOIN articles ON month(articles.dat) = miesiace.id
  3. LEFT JOIN news ON month(news.dat) = miesiace.id
  4. GROUP BY miesiace.id
yaro
Dzięki Norbas

Działa jak należy smile.gif

Jednak proponuje jeszcze zmiane na RIGHT JOIN

  1. SELECT miesiac, COUNT(DISTINCT news.id) + COUNT(DISTINCT articles.id)
  2. FROM miesiace RIGHT JOIN articles ON month(articles.dat) = miesiace.id
  3. RIGHT JOIN news ON month(news.dat) = miesiace.id
  4. GROUP BY miesiace.id


Wielkie dzięki raz jeszcze
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.