Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie do bazy o "najnowszą" wersję rekordu
tjd84
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 14.09.2011

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


Witam,
Od kilku godzin głowię się nad problemem dotyczącym sformułowania zapytania do bazy mySQL, który zwróci najnowszą wersję dokumentu o określonym identyfikatorze. Baza wygląda mniej więcej tak:

wersja_dokumentu [INT, PRIMARY, AUTOINC] | identyfikator_dokumentu [INT] | dane [TEXT]
0 | 0 | tresc 1
1 | 0 | tresc 2
2 | 0 | tresc 3
3 | 1 | tresc 4
4 | 1 | ..............
5 | 1 | | ..........
6 | 2 | ........
7 | 2 | .........
8 | 2 | ........

Chciałbym jednym zapytaniem sprawić, aby dostać coś takiego:

wersja_dokumentu [INT, PRIMARY, AUTOINC] | identyfikator_dokumentu [INT] | dane [TEXT]
2 | 0 | tresc 3
5 | 1 | | ..........
8 | 2 | ........

Jak widać dla każdego identyfikatora dokumentu należy znaleźć maksymalną wartość wersji i zwrócić rekord.

Jak to zrobić, za cholerę nie wiem i będę wdzięczny za wskazówki.

Ten post edytował tjd84 14.09.2011, 14:18:46
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Odpowiednie sortowanie (ORDER BY) i grupowanie (GROUP BY) powinno załatwić sprawę. Jak będziesz miał dalsze pytania to pisz podając swoje dotychczasowe rozwiązanie.
Go to the top of the page
+Quote Post
tjd84
post
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 14.09.2011

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


Póki co mam tak:
  1. SELECT * FROM `dokumenty` GROUP BY `identyfikator_dokumentu` ORDER BY `wersja_dokumentu` DESC

Niestety zamiast najnowszego dokumentu otrzymuję najstarszy.
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Najpierw trzeba posortować, a później pogrupować:
  1. SELECT * FROM (SELECT * FROM `dokumenty` ORDER BY `wersja_dokumentu` DESC) `posortowane_dokumnety` GROUP BY `identyfikator_dokumentu`

Jednak wymaga to użycia podzapytania, co może nie być optymalnym rozwiązaniem przy dużej liczbie rekordów. Można również skorzystać z tego, że najnowsza wersja dokumentu jest jednocześnie największą liczbą (wersją) dla każdego dokumentu:
  1. SELECT MAX(`wersja_dokumentu`) AS `najnowsza_wersja_dokumentu`, `identyfikator_dokumentu`, `dane` FROM `dokumenty` GROUP BY `identyfikator_dokumentu`

Co powinno działać szybciej.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 13:00