Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Zliczanie rekordów na bieżąco
Forum PHP.pl > Forum > Przedszkole
Michael2318
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 :/
Sephirus
  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 ...
Michael2318
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.
Sephirus
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.
Michael2318
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 |
Sephirus
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
Michael2318
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.
Sephirus
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
Michael2318
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.
Sephirus
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
Michael2318
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
Sephirus
  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.
Michael2318
To zapytanie i tak zwraca tylko jeden rekord i na dodatek w trzech przypadkach (size 1, 2 i 3) jest liczba 48.
Sephirus
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.