Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
Hej,
Mam takie rekordy w bazie: xxxx xxxx yyyy czyli 2 są takie same i 1 inny, w sumie 2 różne. Potrzebuję zrobić zapytanie w stylu (poglądowo): select x,y from tabela order by data desc limit (ilość różnych rekordów czyli 2*30) i nie bardzo mam pomysł jak takie coś zrobic. Ma ktoś może pomysł? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 6 809 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%)
|
A mógłbyś wyjaśnić czemu potrzebny jest ten limit?
Akurat w Twoim przypadku przy trzech rekordach limit będzie na 6 rekordów, więc jest kompletnie niepotrzebny. Oczywiście w innych przypadkach będzie mieć wpływ. I dlaczego jest tam mnożnik 30? |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
Przykładowo podałem bazę, rekordów ja tam mam około 100 i teraz jeśli dam limit 30, to pokaże mi w sumie 15 * xxxxx i 15 * yyyyy, a chciałbym, żeby pokazało 30 * xxxxx i 30 * yyyyy, a więc musiałbym dać limit 60, a nie wiem ile będzie różnych rekordów dublujących się, więc jeśli bym je zliczył, wystarczyłoby pomnożyć limit 30 razy ilość różnych rekordów
|
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Wystarczy ze bedziesz mial pod rzad 59 xxxx i 1 yyyy i caly twoj zmyslny algorytm szlag trafi (IMG:style_emoticons/default/wink.gif)
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
w sumie masz rację. to jakby to rozwiązać?
chociaż czekaj, 59x i 1y, to 2 różne, a wiec 30*2 rozne = 60, a wiec tyle ile byłoby rekordow, czyli by zadziałało? Ten post edytował Destrudo 8.02.2017, 17:23:05 |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 95 Pomógł: 7 Dołączył: 27.10.2015 Ostrzeżenie: (0%)
|
jaki to problem ma rozwiązywać? bo wygląda że trzeba do tego zupełnie inaczej podejść, ale musisz powiedzieć jaki problem to ma rozwiązywać, a nie sugerować gotowe (raczej złe) pomysły.
|
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
powinno mi pokazać ostatnie 30 rekordow z bazy danych dla każdego rodzaju rekordu, czyli 30 dla xxxx i 30 dla yyyy. Jeśli po prostu wpiszę limit 30, to mi pokaże po 15 (w sumie będzie 30), a chciałbym po 30 dla każdego
|
|
|
|
Post
#8
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat chociaż czekaj, 59x i 1y, to 2 różne, a wiec 30*2 rozne = 60, a wiec tyle ile byłoby rekordow, czyli by zadziałało? No jak zadziala? Wyswietli ci 59xxx i 1 yyyy a chciales miec po 30 (IMG:style_emoticons/default/wink.gif)
|
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
fakt (IMG:style_emoticons/default/biggrin.gif) chodzi mi generalnie o to, żeby nie tyle po 30, co maksymalnie 30 z każdego, bo nieraz będzie 50 z jednego i 2 z innego czy tego typu
|
|
|
|
Post
#10
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat żeby nie tyle po 30, co maksymalnie 30 z każdego, bo nieraz będzie 50 z jednego i 2 z innego czy tego typu No tego to ja sie domyslilem (IMG:style_emoticons/default/wink.gif)
|
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
Widzę właśnie (IMG:style_emoticons/default/biggrin.gif) To jakby to rozwiąząć?
|
|
|
|
Post
#12
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Wpierw pobierasz wszystkie rozne xxxx yyyyy.
SELECT DISTINCT.... potem dla kazdego piszesz zapytanie ktore pobierze ci max 30 rekordow dla kazdego z nich ...where costam=xxxxx limit 30 ...where costam=yyyyy limit 30 itd Mozesz to upchnoc w UNION i miec jedno zapytanie zamiast x malych |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
a jeśli nie znam xxxxx i yyyy? tzn bedzie tyle roznych, ze caly czas musialbym modyfikowac zapytanie zeby mi pokazywalo dobrze i dodawac kolejne warunki z nowymi rekordami? czy źle zrozumiałem?
|
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 95 Pomógł: 7 Dołączył: 27.10.2015 Ostrzeżenie: (0%)
|
zrób correlated subquery
|
|
|
|
Post
#15
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Dlatego napisalem
Cytat Wpierw pobierasz wszystkie rozne xxxx yyyyy. SELECT DISTINCT.... To zapytanie zwroci ci wszyskie xxxx yyyyy zzzz czy co ty tam masz. |
|
|
|
Post
#16
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
Jednak nie rozumiem :/ mógłbyś podać poglądowy przykład? może niekoniecznie gotowca, ale schemat, bo zbyt ogolnie napisales i nie rozumiem. dajmy na to, że mam już zrobiony select distinct na limit 30 tak? co dalej?
|
|
|
|
Post
#17
|
|
|
Grupa: Zarejestrowani Postów: 95 Pomógł: 7 Dołączył: 27.10.2015 Ostrzeżenie: (0%)
|
nie słuchaj nospora - zrób correlated subquery tak jak Ci wujek mówi:
potem:
potem:
działa? ano działa |
|
|
|
Post
#18
|
|
|
Grupa: Zarejestrowani Postów: 6 809 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%)
|
javafxdev,
nie do końca, bo miały to być rekordy sortowane według daty, a nie po prostu top/last z grupy.
5 rekordów z każdej grupy sortowane według daty desc:
|
|
|
|
Post
#19
|
|
|
Grupa: Zarejestrowani Postów: 95 Pomógł: 7 Dołączył: 27.10.2015 Ostrzeżenie: (0%)
|
ja bym się pokusił jeszcze w Twoim przykładzie zeby zamiast x1.x=x2.x dać x1.id=x2.id wtedy trochę bardziej zoptymalizowane będzie. ale ogólnie masz rację - w moim przykładzie brakowało sortowania po datach w grupach. Chodziło mi bardziej o pokazanie żeby nie robić jakiś niepotrzebnych UNIONÓW i DISTINCTÓW tylko ładnie machnąć w SQL.
|
|
|
|
Post
#20
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 0 Dołączył: 10.10.2011 Ostrzeżenie: (0%)
|
Dziękuje, działa fajnie, tylko jak np pokazuje mi:
xxxx - 30 rekordów yyyy - 30 rekordów i teraz dajmy na to dodam 2 kolejne rekordy xxxx i yyyyy, tylko że yyyy z nowszą datą, to yyyy - 30 rekordów, pokaże się najpierw, a chciałbym tego nie zmieniać, czyli jak kolejność jest już: xxxx - 30 rekordów yyyy - 30 rekordów to żeby tylko rekordy się sortowały, a nie xxxx i yyy i kolejność nie zmieniła się na: yyyy - 30 rekordów xxxx - 30 rekordów Ten post edytował Destrudo 9.02.2017, 08:37:22 |
|
|
|
Post
#21
|
|
|
Grupa: Zarejestrowani Postów: 6 809 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%)
|
Jak wygląda ORDER BY w zapytaniu?
|
|
|
|
Post
#22
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat nie słuchaj nospora - zrób correlated subquery tak jak Ci wujek mówi: @wujek wszystko fajnie pieknie, ale jak wyglada sprawa z wydajnoscia takiego zapytania dla wiekszej ilosci danych? Bo tak na pierwszy rzut oka to nie wyglada to za dobrze |
|
|
|
Post
#23
|
|
|
Grupa: Zarejestrowani Postów: 95 Pomógł: 7 Dołączył: 27.10.2015 Ostrzeżenie: (0%)
|
Załóżmy, że różnych (x,y,z.....) mamy 50 po 10 w każdym przypadku - Twoja metoda wykona 1 zapytanie DISTINCT, i 50 zapytań do pobrania rekordów czyli 51 zapytań żeby pobrać 500 rekordów - troche dużo sam roudtrip do bazy będzie mało wydajny i wydajność będzie spadać wraz z większą ilością różnych elementów - słabo skalowalne, natomiast wykonanie subquery skaluje się lepiej, bo za kazdym razem masz 1 zapytanie - niezależnie od ilości różnorodnych elementów.
|
|
|
|
Post
#24
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Dlatego powiedzialem by uzyc union. Wowczas masz dwa zapytania.
A teraz zalozmy ze masz milion rekordow i 50 roznych danych. Te podzapytania ktore tam masz i liczenie dla kazdego wiersza pokolei danych nie wyglada dla mnie zbyt obiecujaco |
|
|
|
Post
#25
|
|
|
Grupa: Zarejestrowani Postów: 95 Pomógł: 7 Dołączył: 27.10.2015 Ostrzeżenie: (0%)
|
jak napiszesz kawałek kodu, który robi to Twoją metodą (skleja te wielkie UNIONY itd) to ja załaduje do bazy danych 1mln rekordów z różnymi x,y,z i porównamy, a jak nie zrobisz to załóżmy że moje działa wydajniej (IMG:style_emoticons/default/wink.gif)
|
|
|
|
Post
#26
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
OK, specjalnie dla ciebie odpalilem te wasze cudo.
Liczba rekordow: 200 000 Liczba roznych danych:100 Czas pobrania 30 rekordow dla danego jednego: 0.03s Union ze 100 takimi zapytaniami: 3 sekundy DISTINCT by pobrac te 100 roznych danych: 0.2s. Laczny czas: nie wiecej niz 5 sekund. A teraz wasze cudo: czas:1 minuta 52 sekundy Tyle w temacie (IMG:style_emoticons/default/tongue.gif) edit: a skad taki dlugi czas u Was? Bo tak jak mowilem wczesniej, wy tworzycie tyle zapytan ile macie rekordow. Jest 200 000 rekordow to to zapytanie SELECT COUNT(*) FROM xy AS x2 WHERE x1.data<=x2.DATA AND x1.x=x2.x wykona sie 200 000 razy. I ty mi mowisz ze moje 50 zapytan jest obciazeniem.... (IMG:style_emoticons/default/tongue.gif) |
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 08:17 |