Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Mnożenie w limicie
Destrudo
post
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ł?


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
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?


--------------------
Go to the top of the page
+Quote Post
Destrudo
post
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


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
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 wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Destrudo
post
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


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
javafxdev
post
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.
Go to the top of the page
+Quote Post
Destrudo
post
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


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
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 wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Destrudo
post
Post #9





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 10.10.2011

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


fakt 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


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
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 wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Destrudo
post
Post #11





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 10.10.2011

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


Widzę właśnie biggrin.gif To jakby to rozwiąząć?


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Destrudo
post
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?


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
javafxdev
post
Post #14





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 27.10.2015

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


zrób correlated subquery
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Destrudo
post
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?


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post
javafxdev
post
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:
  1. CREATE TABLE test (id int(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT , x varchar(255) NOT NULL);


potem:

  1. INSERT INTO test (x) VALUES ('xxx'), ('yyy');
  2. INSERT INTO test (x) VALUES ('xxx'), ('yyy');
  3. INSERT INTO test (x) VALUES ('xxx'), ('yyy');
  4. INSERT INTO test (x) VALUES ('xxx'), ('yyy');
  5. INSERT INTO test (x) VALUES ('xxx'), ('yyy');
  6. INSERT INTO test (x) VALUES ('xxx'), ('xxx');
  7. INSERT INTO test (x) VALUES ('zzz'), ('zzz');


potem:

  1. SELECT * FROM test t WHERE (SELECT COUNT(*) FROM test t2 WHERE t.id <= t2.id AND t.x = t2.x) <= 4 ORDER BY t.x;


działa? ano działa
Go to the top of the page
+Quote Post
trueblue
post
Post #18





Grupa: Zarejestrowani
Postów: 6 806
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.

  1. CREATE TABLE `xy` (
  2. `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `x` VARCHAR(255) NOT NULL,
  4. `data` DATE NULL DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. )
  7.  
  8. INSERT INTO `xy` VALUES (1, 'xxx', '2016-01-01');
  9. INSERT INTO `xy` VALUES (2, 'yyy', '2016-01-02');
  10. INSERT INTO `xy` VALUES (3, 'xxx', '2016-01-03');
  11. INSERT INTO `xy` VALUES (4, 'yyy', '2016-01-04');
  12. INSERT INTO `xy` VALUES (5, 'xxx', '2016-01-05');
  13. INSERT INTO `xy` VALUES (6, 'yyy', '2016-01-06');
  14. INSERT INTO `xy` VALUES (7, 'xxx', '2016-01-07');
  15. INSERT INTO `xy` VALUES (8, 'yyy', '2016-01-08');
  16. INSERT INTO `xy` VALUES (9, 'xxx', '2016-01-09');
  17. INSERT INTO `xy` VALUES (10, 'yyy', '2016-01-10');
  18. INSERT INTO `xy` VALUES (11, 'xxx', '2016-01-11');
  19. INSERT INTO `xy` VALUES (12, 'xxx', '2016-01-12');
  20. INSERT INTO `xy` VALUES (13, 'zzz', '2016-01-13');
  21. INSERT INTO `xy` VALUES (14, 'zzz', '2016-01-14');


5 rekordów z każdej grupy sortowane według daty desc:
  1. SELECT x3.x,x3.DATA FROM (SELECT x1.*, (SELECT COUNT(*) FROM xy AS x2 WHERE x1.data<=x2.DATA AND x1.x=x2.x) AS wiersz FROM xy AS x1) x3
  2. WHERE wiersz <=5 ORDER BY x, DATA DESC;


--------------------
Go to the top of the page
+Quote Post
javafxdev
post
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.
Go to the top of the page
+Quote Post
Destrudo
post
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


--------------------
Destrudo.pl - Futurystyczny portal psychologiczny. W portalu między innymi skrajne i drastyczne obszary psychologii, nie dla każdego...
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 21.08.2025 - 10:08