Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Zliczanie rekordów na bieżąco
Michael2318
post 7.02.2013, 08:55:04
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


Mam taką tabelę:
Cytat
|id|view_post|field_order


I teraz, zakładając że w polu view_post jest liczba z przedziału 1-3, to:
jak przy takim zapytaniu:

  1. SELECT * FROM `tabela` ORDER BY view_post ASC, field_order ASC


Można policzyć od razu i zapisać do zmiennej ilość view_post równej 1, równej 2 oraz równej 3? Myślałem żeby coś z having pokombinować, ale nie bardzo mi to wychodzi :/
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 08:57:48
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


  1. SELECT view_post , COUNT(id) AS ilosc FROM `tabela` GROUP BY view_post ORDER BY view_post ASC


zwróci:

Kod
view_post    |    ilosc
1 | 13
2 | 142
3 | 45
... itd ...


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Michael2318
post 7.02.2013, 09:03:26
Post #3





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


Tak, tylko że ja chcę efekt taki:

view_post = 1:
field_order = 1
field_order = 3
field_order = 5

view_post = 2:
field_order = 2
field_order = 4
field_order = 6


Po prostu te liczby z przedziału 1-3 to są grupy, a w tych grupach musze mieć poukładane wszystko zgodnie z field_order, a dodatkowo chcę znać liczbę wszystkich view_post'ów dla cyfr 1, 2 i 3.

Obecnie Twój kod ignoruje zupełnie field_order.

Ten post edytował Michael2318 7.02.2013, 09:04:02
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 09:27:03
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ehh jednym zapytaniem się nie da tego ogarnąć (znaczy da się ale to nie ma sensu większego...).

Pamiętaj, że zapytanie SQL zwraca wiersze wyników - jeśli napiszesz mi kilka przykładowych wierszy zwróconych przez takie zapytanie jakiego szukasz to Ci je napisze.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Michael2318
post 7.02.2013, 09:31:00
Post #5





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


Załóżmy, że w bazie mam 6 rekordów, dwa są w grupie (view_posts) 1, dwa w grupie 2 i dwa w grupie 3:
Cytat
| ID | view_posts | field_order |
| X | 1 | 2 |
| X | 1 | 4 |
| X | 2 | 1 |
| X | 2 | 3 |
| X | 3 | 5 |
| X | 3 | 6 |
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 09:38:35
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ale to jest zawartość tabeli czy tak mają wyglądać wyniki zapytania? Bo to mi wygląda na bardziej na zawartość tabelki lub ewentualnie wyniki zapytania Twojego tego podstawowego.

Ogólnie:

Chcesz naraz otrzymać liczbę wierszy i te wiersze w kolejności po podanym przez Ciebie polu. Albo podziel to na dwa zapytania:

  1. SELECT * FROM tabela WHERE view_post = 1 ORDER BY field_order ASC;
  2.  
  3. -- i:
  4.  
  5. SELECT COUNT(id) AS size FROM tabela WHERE view_post = 1;


lub zostań przy tym pierwszym i policz wiersze w tabeli wynikowej w PHP po prostu.

Gdybyś chciał albo liczbę wyników albo same wyniki nie było by problemu ale jak chcesz i jedno i drugie to z braku laku nawet możesz pobrać wszystko tym zapytaniem pierwszym Swoim, wrzucić wyniki do jakiejś tablicy, przejechać po niej i policzyć wiersze a potem je ładnie wyświetlić.

W najgorszym (najmniej wydajnym chyba jednak podejściu) możesz dodać do swojego zapytania 3 joiny, które dodadzą liczbę wyników dla danego post_view do każdego wiersza wyniku... ale ja to stanowczo odradzam:

  1. SELECT *, COUNT(a.id) AS size1, COUNT(b.id) AS size2, COUNT(c.id) AS size3 FROM `tabela`
  2. JOIN tabela a ON a.view_post = 1
  3. JOIN tabela b ON b.view_post = 2
  4. JOIN tabela c ON c.view_post = 3
  5. ORDER BY view_post ASC, field_order ASC


uzyskasz przykładowo coś takiego:

Kod
id | view_post    |    size1 | size2 | size3
1 | 1 | 2 | 3 | 4
2 | 1 | 2 | 3 | 4
3 | 2 | 2 | 3 | 4
... itd ...


Zamiast JOIN możesz też użyć podzapytań... Lecz czy tak czy inaczej - to są antywzorce i tak się robić nie powinno smile.gif

EDIT: błąd w zapytanku wink.gif

Ten post edytował Sephirus 7.02.2013, 09:48:31


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Michael2318
post 7.02.2013, 09:51:35
Post #7





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


A może da się wyciągnąć największy field_order dla danej kategorii jednym zapytaniem? W powyższym zapytaniu będzie to field_order, rekordy 2, 4 i 6.
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 09:55:31
Post #8





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Cytat
A może da się wyciągnąć największy field_order dla danej kategorii jednym zapytaniem?


Da się.

Cytat
W powyższym zapytaniu będzie to field_order, rekordy 2, 4 i 6.


Nie kumam. smile.gif

  1. SELECT view_post, MAX(field_order) AS max_field_order FROM tabela GROUP BY view_post


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Michael2318
post 7.02.2013, 09:59:45
Post #9





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


To jest chyba to o co mi chodzi tylko czy da się do tego znowu podpiąć to nieszczęsne sortowanie w grupach przez pole field_order?

EDIT:

Nie rozumiem czemu to zapytanie:

  1. SELECT field_order, view_post, MAX(field_order) AS max_field_order FROM `tabela` GROUP BY view_post ORDER BY field_order ASC


Zwraca tylko 3 rekordy, skoro mam ich 6? Co prawda max_field_order'ów jest rzeczywiście tylko 3, ale ja potrzebuję wszystkie rekordy.

Ten post edytował Michael2318 7.02.2013, 10:09:47
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 10:14:22
Post #10





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


No w tym sęk właśnie, że jeśli coś grupujesz to pojawia się tylko jeden rekord dla danej wartości. Jeśli grupujesz po view_post przykładowo to dla każdej różnej wartości view_post dostaniesz po jednym rekordzie - innymi słowy przy GROUP BY nie pojawi się dwa razy ta sama wartość view_post smile.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Michael2318
post 7.02.2013, 10:23:04
Post #11





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


Ahm. Próbowałem użyć tego zapytania dla testów:

  1. SELECT *, COUNT(a.id) AS size1, COUNT(b.id) AS size2, COUNT(c.id) AS size3 FROM `tabela`
  2. JOIN tabela a ON a.view_post = 1
  3. JOIN tabela b ON b.view_post = 2
  4. JOIN tabela c ON c.view_post = 3
  5. ORDER BY view_post ASC, field_order ASC


Ale zwraca:

#1052 - Column 'view_post' in order clause is ambiguous
questionmark.gif
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 10:25:06
Post #12





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


  1. SELECT *, COUNT(a.id) AS size1, COUNT(b.id) AS size2, COUNT(c.id) AS size3 FROM `tabela` t
  2. JOIN tabela a ON a.view_post = 1
  3. JOIN tabela b ON b.view_post = 2
  4. JOIN tabela c ON c.view_post = 3
  5. ORDER BY t.view_post ASC, t.field_order ASC


my bad - daj teraz

EDIT: ale naprawdę nie stosuj tego - już lepiej przerobić wynik prostszego zapytania czy dwóch w PHP.

Ten post edytował Sephirus 7.02.2013, 10:25:54


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Michael2318
post 7.02.2013, 10:27:56
Post #13





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


To zapytanie i tak zwraca tylko jeden rekord i na dodatek w trzech przypadkach (size 1, 2 i 3) jest liczba 48.
Go to the top of the page
+Quote Post
Sephirus
post 7.02.2013, 10:30:43
Post #14





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Racja - zapomniałem o GROUP BY

  1. SELECT *, COUNT(a.id) AS size1, COUNT(b.id) AS size2, COUNT(c.id) AS size3 FROM `tabela` t
  2. JOIN tabela a ON a.view_post = 1
  3. JOIN tabela b ON b.view_post = 2
  4. JOIN tabela c ON c.view_post = 3
  5. GROUP BY t.id
  6. ORDER BY t.view_post ASC, t.field_order ASC


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
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 Wersja Lo-Fi Aktualny czas: 29.04.2025 - 06:42