Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] Pobranie tylko najnowszych czasopism, grupując po id autora, Autor może mieć kilka czasopism (sortuje po polu number oraz year)
Sajrox
post
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 7
Dołączył: 9.10.2007
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Witam,

Posiadam tabele "presses"

ID | USER_ID | TITLE | NUMBER | YEAR

1 | 5 | A | 6 | 2008
2 | 6 | A | 2 | 2009
3 | 6 | B | 3 | 2010


Chciałbym aby na wyjściu otrzymać czasopismo o ID 1 oraz 3 czyli tylko te najnowsze danego użytkownika.

  1. SELECT id, MAX(year), MAX(number) FROM presses GROUP BY user_id


Ale w wyniki ID mi się nie zgadzają bo otrzymuje

ID | MAX(year) | MAX(number)

1 | 2008 | 6
2 | 2010 | 3

A powinno być
1 | 2008 | 6
3 | 2010 | 3
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ponieważ grupowanie następuje szybciej to tak się dzieje. Użycie klauzuli max zafałszuje wyniki ponieważ wybiera maksymalną wartość olewając resztę. Co z tego, że dając max(year) uzyskasz największą wartość roku, skoro reszta danych będzie nie pasująca do rekordu?
Nawet jeśli uzyskasz 2010 jako rok, to number nadal będzie równe 2. Wziąłem i przykład Twój wrzuciłem do bazy i zapytanie
  1. SELECT id, user_id, title, max( number ), max( years ) FROM pressess GROUP BY user_id
zwróciło mi
1 5 A 6 2008
2 6 A 3 2010
a to jest pomieszanie z poplątaniem o jakim Ci pisałem. Bo wrzuciło z pierwszego pasującego 6 oraz A, ale już potem walnęło max dla number i dla years.
Inna sprawa, że year to słowo zarezerwowane i nie powinno się go używać jako nazwa kolumny. Stąd masz byka i dlatego między innymi nie wyświetla prawidłowo. Albo wtedy używasz innej nazwy kolumny (co zrobiłem ja), albo używasz odwróconych apostrofów, czyli takiego zapisu -> `year`.
Aby zrobić to co Ty chcesz należałoby najpierw posortować rekordy po roku a dopiero potem grupować. To zaś najprościej wykonać poprzez poslanie sortowania do podzapytania w ten sposób:
  1. SELECT s.id, s.number, s.years FROM (SELECT id, user_id, years, number FROM users ORDER BY years DESC) s GROUP BY s.user_id


EDIT. Jeśli w tym roku ma kilka czasopism to w podzapytaniu jeszcze ORDER BY zmień dorzucając kolejny fragment i tworząc:
ORDER BY years DESC, number DESC

Ten post edytował thek 22.01.2010, 20:41:46
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 17:07