Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/MYSQL] Grupowanie i sortowanie
Forum PHP.pl > Forum > PHP
Vafel
  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM " . POSTS_TABLE . "
  3. WHERE poster_id = $user_id
  4. GROUP BY user_agent
  5. ORDER BY post_id DESC LIMIT 10";


Witam. Chcę, aby pogrupowane wiersze według user_agent, czyli system, przeglądarka, były posortowane według użycia jej w danym poście (post_id) malejąco. W tym przypadku najpierw grupuje, potem sortuje, ale według pierwszego posta z tej przeglądarki, czyli najstarszego, a ma sortować według najnowszego.

Dam screena, jak to wygląda, bo może być niezrozumiałe.



Więc dajmy na to, post na xp, był napisany wcześniej, niż na win7, więc logiczne, że win7 jest wyżej, ale jeżeli napiszemy znów posta na xp, kolejność się nie zmienia, bo sortuje patrząc na pierwszy post z tego systemu, a nie ten najnowszy. Gdyby patrzyło na najnowszy, winXp przeskoczyłby wyżej, ponieważ ostatni post użytkownika był właśnie napisany na tym systemie, ale tak nie jest.

Wiem, że da się to jakoś zrobić przez połączenie zapytań, niestety ja już wysiadam, nie jestem jeszcze na takim poziomie smile.gif Jakby ktoś mógł mi to przerobić na szybko, byłoby super smile.gif

Pomoże ktoś? Bo meczę to już kilka dni.
tehaha
trochę chaotycznie to napisałeś, więc do końca nie wiem o co Ci chodzi, bo zamiast dać strukturę bazy i napisać co chcesz osiągnąć to dajesz jakieś screen, który tylko dla Ciebie jest zrozumiały, ale zgaduję, że chodzi Ci o dość popularny problem z group by i order by i chciałbyś, żeby wyniki zostały posortowane przed grupowaniem, jeżeli tak to tutaj masz rozwiązanie -> http://www.cafewebmaster.com/mysql-order-sort-group
Vafel
Właśnie próbowałem to zrobić na podobnym przykładzie, ale cały czas błąd:
SQL Error : 1248 Every derived table must have its own alias
Byłbym wdzięczny jakby mi ktoś na podstawie mojego kodu to przedstawił smile.gif
tehaha
no nie przesadzaj, masz gotowy i działający przykład wystarczy swoje kolumny podstawić, wykaż trochę inicjatywy
Cytat
Właśnie próbowałem to zrobić na podobnym przykładzie, ale cały czas błąd.
To pokaż jak próbowałeś, a wkleiłeś błąd do google? sprawdziłeś co oznacza?

edit: no i co jest nie jasnego? wklej do google tłumacz jeśli nie rozumiesz ang, wklej to też do przeglądarki google i w pierwszym wyniku masz odpowiedź
Vafel
Heh, po angielsku potrafię, ale łatwo się mówi. Ja jestem bardzo początkujący, ta modyfikacja nie jest zrobiona prze zemnie. Więc w tym przypadku kompletnie błądzę po omacku.
tehaha
a dlaczego nie wkleisz tu swojej próby? ja Ci chętnie pomogę ale jeżeli liczysz, że zrobię to za Ciebie to marne szanse, wystarczy odrobina dobrych chęci z Twojej strony, podałem Ci link z gotowym zapytaniem, to jest dokładnie takie zapytanie jakie potrzebujesz, wystarczy, że podstawisz nazwy swoich kolumn i nazwę tabelki
Vafel
Niech będzie. Tylko tak jak mówiłem, takie rzeczy to jeszcze dla mnie czary mary, więc:

  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM
  3. (
  4. SELECT user_agent, COUNT(*) as how_much
  5. FROM " . POSTS_TABLE . "
  6. WHERE poster_id = $user_id
  7. ORDER BY post_id DESC LIMIT 10
  8. )
  9.  
  10. GROUP BY user_agent";


EDIT: Pominąłem WHERE. Poprawiłem.
tehaha
no a teraz:
1. z podzapytania wywal count i limit
2. dodaj alias zobacz ten przykład z linku pominąłeś
  1. AS my_table_tmp

3. daj limit na samym końcu
Vafel
  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM
  3. (
  4. SELECT user_agent
  5. FROM " . POSTS_TABLE . "
  6. WHERE poster_id = $user_id
  7. ORDER BY post_id DESC
  8. )
  9. AS " . POSTS_TABLE . "_alias
  10. GROUP BY user_agent";


Ten kod wszedł bez błędu, ale nie sprawdzałem, czy działa jak chciałem.
Właściwie, co ja mam za alias tam dać? Limit na końcu, poza nawiasem? Bo ja chcę limit do order.
tehaha
nazwa aliasu nie jest istotna bo to chodzi o to, że podzapytanie zwraca Ci tak jakby posortowaną tabelę dla której trzeba nadać tymczasową nazwę i teraz w tej posortowanej tymczasowej tabelce grupujesz wyniki i wyciągasz sobie 10. LIMIT daj całkiem na samym końcu, czyli za GROUP BY
Vafel
  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM
  3. (
  4. SELECT user_agent
  5. FROM " . POSTS_TABLE . "
  6. WHERE poster_id = $user_id
  7. ORDER BY post_id DESC
  8. )
  9. AS " . POSTS_TABLE . "_alias
  10. GROUP BY user_agent LIMIT 10";


Weszło, ale mam posortowane według alfabetu z kolumny user_agent, a chciałem według post_id.
tehaha
dziwne, a spróbuj jeszcze dodać to samo ORDER BY w głównym zapytaniu czyli GROUP BY, a jak nie zadziała to daj zrzut bazy z danymi to sprawdzę u siebie to zapytanie
Vafel
Czyli mam dodać ORDER BY drugi raz po GROUP BY? Wtedy zwraca mi błąd.
tehaha
eh, a jak myślisz co ja mogę wywnioskować z samego "zwraca mi błąd". coś nie działa? -> wklejasz kod i treść błędu, po uprzednim sprawdzeniu w google co znaczy błąd
Vafel
Wygląda to tak.

  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM
  3. (
  4. SELECT user_agent
  5. FROM " . POSTS_TABLE . "
  6. WHERE poster_id = $user_id
  7. ORDER BY post_id DESC
  8. )
  9. AS " . POSTS_TABLE . "_alias
  10. GROUP BY user_agent LIMIT 10
  11. ORDER BY post_id DESC";


Couldn't obtain user agents list

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY post_id' at line 11

SELECT user_agent, COUNT(*) as how_much FROM ( SELECT user_agent FROM phpbb_posts WHERE poster_i
tehaha
błąd jasno napisał sprawdź manual, no to sprawdź manual http://dev.mysql.com/doc/refman/5.0/en/select.html

i zobacz w jakiej kolejności daje się limit, group, order
popraw kod i wklej jeszcze raz
Vafel
  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM
  3. (
  4. SELECT user_agent
  5. FROM " . POSTS_TABLE . "
  6. WHERE poster_id = $user_id
  7. ORDER BY post_id DESC
  8. )
  9. AS " . POSTS_TABLE . "_alias
  10. GROUP BY user_agent
  11. ORDER BY post_id DESC LIMIT 10";


SQL Error : 1054 Unknown column 'post_id' in 'order clause'
tehaha
w podzapytaniu czyli w tym nawiasie dodaj kolumnę post_id czyli SELECT post_id, user_agent
Vafel
  1. $sql = "SELECT user_agent, COUNT(*) as how_much
  2. FROM
  3. (
  4. SELECT post_id, user_agent
  5. FROM " . POSTS_TABLE . "
  6. WHERE poster_id = $user_id
  7. ORDER BY post_id DESC
  8. )
  9. AS " . POSTS_TABLE . "_alias
  10. GROUP BY user_agent
  11. ORDER BY post_id DESC LIMIT 10";


Z tego co pobieżnie sprawdziłem, to działa jak należy smile.gif Ogromne dzięki za pomoc smile.gif

A jak bym chciał zrobić to wyświetlanie inaczej, to znaczy żeby wyświetlało wszystkie, ale po 10 na podstronach. Trudne to jest do zrobienia?
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.