![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 195 Pomógł: 0 Dołączył: 13.04.2004 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam pewien dość irytujący problem:
Mam w MySQL 5 tabelę: Kod +--+-----+----------------+ Pole blablabla nie jest dla nas istotne. Jak widać rekordy mają id własne i id grupy (pole owner). Teraz chciałbym jednym zapytaniem pozbyć się starszych rekordów z danej grupy. Zależy mi, żeby w każdej grupie pozostały np. maks 2 rekordy, przy czym w pierwszej kolejności należy kasować te z niższymi numerami id. Nie ma reguły że te same grupy owner będą następowały bezpośrednio po sobie (np. owner =1 mogą mieć rekordy o id 2, 5, 15). Po wykonaniu takiego zapytania powyższa tabelka powinna dojść do takiego rezultatu:|id|owner| blablabla | +--+-----+----------------+ |1 | 1 | kobakovga | |2 | 1 | dwawdadw | |3 | 1 | d21r1rtt2 | |4 | 2 | koawdawdka | |5 | 2 | dawawdaddwa | +--+-----+----------------+ Kod +--+-----+----------------+ |id|owner| blablabla | +--+-----+----------------+ |2 | 1 | dwawdadw | |3 | 1 | d21r1rtt2 | |4 | 2 | koawdawdka | |5 | 2 | dawawdaddwa | +--+-----+----------------+ Zacząłem kombinować coś takiego:
Czy to jest poprawne rozumowanie? Ten post edytował L_Devil 20.05.2008, 12:38:39 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 156 Pomógł: 2 Dołączył: 9.09.2006 Skąd: Londyn/Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Jak piszesz masz MySQL 5 wiec prosta procedurka lub trigger z kursorkiem i po sprawie:)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 121 Pomógł: 15 Dołączył: 19.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
moze cos takiego (mozliwe bledy - nie sprawdzalem):
jak to dziala: - podzapytanie w zlaczeniu sluzy do wyciagniecia tylko tych grup ktore maja nadmiarowe rekordy (w tym przykladzie > 2) - dla polepszenia efektywnosci - podzapytanie w klauzuli WHERE oblicza odwrotny ranking dla danej pozycji w grupie - wybieramy tylko te rekordy z dla ktorych ranking > 2 - usuwamy pasujace rekordy dla rozjasnienia podaje jak bedzie wygladala tabela z obliczonym odwrotnym rankingiem:
Jak widac przy obliczonym odwrotnym rankingu wybranie rekordow do usuniecia jest juz banalne. W innych bazach danych mozna to latwo uproscic jesli istnieje tam funkcja RANK. Nie wiem jak wydajne to bedzie przy duzej liczbie rekordow na grupe, albo przy duzej liczbie grup. Sporym ograniczeniem efektywnosci jest tu na pewno operator IN, moze daloby sie to jakos zamienic na EXISTS. Oczywiscie to zapytanie bedzie usuwac najstarsze rekordy, tylko jesli wartosci pola id beda odzwierciedlaly kolejnosc wstawiania rekordow (tak jak ma to miejsce dla kolumn z atrybutem AUTO_INCREMENT). Pozdrawiam Ten post edytował osiris 26.06.2008, 01:27:36 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 04:50 |