• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

sql - wyniki

Hosting forpsi easy 1 pln
0 głosów
244 wizyt
pytanie zadane 22 sierpnia 2016 w SQL, bazy danych przez Alterwar Dyskutant (7,650 p.)

Witam

Posiadam tabele: Nazwa Tab

id      id_foreign      date
1            1                      
2            1
3            1
4            1
5            1
6            2
7            2
8            2
9            2
10          3
11          3
12          3
13          3

Czy jest możliwość wyciągnięcia ostatnich 5 rekordów każdego id_foreign?

Czyli: ostatnie 5 rekordów z kolumny foreign =3, =2, itd

Próbuję już z dobre 3h i jedyne co to wyciągam ostatnie 5 rekordów z bazy..

1 odpowiedź

0 głosów
odpowiedź 22 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)

Nie rozumiem. Chcesz z tej tabeli wyciągnąć ostatnie pięć id_foreign?

Użyj: 

SELECT TOP 5 id_foreign FROM Nazwa Tab Order by id desc

W przypadku gdy id nie definiuje kolejności rekordów, możesz posortować po dacie dodania do bazy.

Nie wiem, czy dobrze Cię rozumiem.

komentarz 22 sierpnia 2016 przez Alterwar Dyskutant (7,650 p.)
Nie nie. To wiem. Chodzi mi o wyciągnięcie 5 ostatnich rekordów z każdego foreign. Czyli mam np. foreign: 2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6 i chce uzyskac ostatnie 5 rekordów z każdej liczby czyli 22222, 33333, 444444, 55555, 66666 bo DESC wyciągnie mi ostatnie 5 rekordów czyli 66666
komentarz 22 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)
Aaaa. Pewnie da się to zrobić lepiej, ale ja bym zrobił z tego procedurę. Najpierw musisz wyciągnąć wszystkie id_foreign za pomocą DISTINCT albo Group by.

Potem, dla każdego id_foreign zrobił selecta w pętli, który wyciąga TOP 5 dla każdego id_foreign i dołączał wyniki do wynikowej tabeli za pomocą unii.

To takie rozwiązanie na pałę, jak wymyślę coś ciekawszego, to dam znać, na razie mam kaca. :(

Musiałbyś zapoznać się z kursorami, uniami, żeby to zrobić po mojemu.
komentarz 22 sierpnia 2016 przez Alterwar Dyskutant (7,650 p.)
ok dzięki za odpowiedź :)
komentarz 24 sierpnia 2016 przez ghi Nowicjusz (100 p.)

Dobrze rozumiem że to znaczy że jak zrobię selecta z distinct i wyciągnę np 160 różnych id_foreign to potem muszę zrobić ponowne 160 zapytań do tej samej tabeli w pętli o każde id_foreign z wyniku 1 zapytania, i te 160 zapytań ma mieć limit 0,5 posortowane np wg ilości (top). Kurcze trochę to mało wydajne się wydaje...

komentarz 24 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)
No trochę. Dlatego ja bym zrobił pomocniczą tabelę, w której zapisujesz 5 ostatnich id_foregin- kiedy doda się nowy, to np, można użyć triggera, który usunie z tej pomocniczej tabeli najstarsze, a doda te najnowsze ID- zawsze będzie 5 najświeższych. Wtedy wyciągasz te dane zwykłym selectem i zapominasz o problemach z wydajnością,
komentarz 25 sierpnia 2016 przez ghi Nowicjusz (100 p.)
OOO i to rozwiązanie z oddzielną tabelą jest mi bliższe, możesz podpowiedzieć jak to dokładnie ogarnąć? mam tabelę czas|id_newsa|id_foregin jak zawsze trzymać w niej max po 5 rekordów z identycznym id_foregin a te starsze "nadmiarowe" kasować?
komentarz 25 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)
Na tabeli głównej zakładasz trigger. Triggery fragmenty kodu, które wykonują się przy dodawaniu, usuwaniu lub modyfikowaniu rekordów w tabeli.

Musisz utworzyć pomocniczą tabelę, która docelowo będzie zawierała te 5 ostatnich rekordów.

I tak- kiedy dodasz do głównej tabeli rekord, powinien uruchomić się trigger, który sprawdzi, czy dodawanego ID jest w tabeli pomocniczej więcej niż 5- jeśli nie, to po prostu doda do niej to ID, które dodajesz do tabeli głównej, w przeciwnym razie, oprócz dodania nowego rekordu do tabeli pomocniczej, usunie z niej także ten najstarszy.
komentarz 26 sierpnia 2016 przez ghi Nowicjusz (100 p.)
No to przyjdzie mi nauczyć tworzenia triggerow to pojęcie to dla mnie nowość
komentarz 26 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)
To nic trudnego, spokojnie. Powodzenia!
komentarz 26 sierpnia 2016 przez ghi Nowicjusz (100 p.)

czyli mam np tabelę newsy z polami 

time|news_id|cat_id

zależy mi na 5 newsach z każdej cat_id

robię identyczną tabelę pomocniczą nazywam ją last_5_news_by_cat_id z polami

time|news_id|cat_id

tworze trigger dla tabeli newsy

create trigger "news_after_insert" AFTER INSERT ON `newsy`
// co tu dalej powinno być żeby sprawdzało czy w tabeli 
// "last_5_news_by_cat_id"

// jest 5 rekordów z tym cat_id, jeśli nie doda go do tabeli 
// "last_5_news_by_cat_id" a jeśli jest 5 to doda nowy rekord
// taki jak ten dodany do tabeli newsy i usunie ten najstarszy z niej

jak mam to wszystko zapisać?

komentarz 27 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)
No masz if'y, pętle, można programować normalnie. ;)

Najpierw robisz selecta po ID, które właśnie dodałeś i zapisujesz COUNT() klucza głównego tabeli pomocniczej (ograniczonej tym ID które właśnie dodajesz) do zmiennej. Sprawdzasz czy ta zmienna jest większa lub równa 5- jeśli tak, bierzesz ID ostatniego rekordu z zapytania, które wykonałeś na początku i robisz odpowiedniego deleta na tabeli pomocniczej, oraz dodajesz nową wartość, w przeciwnym razie po prostu dodajesz wartość.

W jakim systemie sql to piszesz? Nie chcę podawać gotowego kodu, bo z triggerami miałem niewiele do czynienia, a chwilowo nie mam czasu. Może popołudniu skrobnę jakiś szkielet.

Jak nie chcesz używać triggera, możesz zrobić procedurę składowaną, która zrobi to samo co trigger, ale w przyszłości musisz pamiętać, żeby inserty robić zawsze przez nią, aby zachować spójność danych- trigger uruchomi się przy każdym insercie, co jest trochę bezpieczniejsze (co jednak czasem może być problematyczne :P ).
komentarz 27 sierpnia 2016 przez ghi Nowicjusz (100 p.)
Chyba to usuwanie nadmiarowych ogarnę szybciej w php tylko nie Wiem jak jeśli znajdzie np 7 rekordów z cat_id = 5 powiedzmy znaleźć te starsze 2 jak ustaic które 2 są do usunięcia?
komentarz 27 sierpnia 2016 przez Surykat Stary wyjadacz (14,760 p.)
Jeśli wprowadzisz tą tabelę na samym początku rozwoju bazy danych, to nie musisz się tym martwić. Jeśli natomiast masz jakieś rekordy tego typu, to bym sobie napisał skrypt w sql, który wyczyści mi wszystkie najstarsze rekordy, zostawiając 5 najnowszych. A jak to zrobić?

Jeśli ID u ciebie jest rosnące z każdym kolejnym rekordem (są różne klucze, nie zawsze tak musi być), to możesz pogrupować po głównym ID i grupy przefiltrować, zostawiając 5 największych ID z grup. Można też po dacie dodania rekordu... o ile takie pole sobie gdzieś wcześniej zapisałeś.

Podobne pytania

0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 22 listopada 2019 w SQL, bazy danych przez antypop Mądrala (5,720 p.)
0 głosów
1 odpowiedź 1,596 wizyt
pytanie zadane 26 maja 2017 w SQL, bazy danych przez Milesq Nałogowiec (32,020 p.)

92,081 zapytań

140,736 odpowiedzi

317,696 komentarzy

61,401 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia w koszyku, uzyskując rabat aż -50% (w dniach 24.11 - 29.11 z okazji Black Friday, a potem będzie to -30%) na bilety w wersji "Standard"! Więcej informacji na temat akademii znajdziecie tutaj. Dziękujemy Sekurakowi za tak fajną zniżkę dla Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 15% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...