Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP/MYSQL] Grupowanie i sortowanie, group by order by
Vafel
post 3.10.2011, 21:20:09
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


  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.

Ten post edytował Vafel 3.10.2011, 21:24:29
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 21:33:40
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 21:36:15
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


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

Ten post edytował Vafel 3.10.2011, 21:40:47
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 21:42:40
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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ź

Ten post edytował tehaha 3.10.2011, 21:46:29
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 22:10:51
Post #5





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


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.

Ten post edytował Vafel 3.10.2011, 22:11:07
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 22:23:38
Post #6





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 22:30:25
Post #7





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


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.

Ten post edytował Vafel 3.10.2011, 22:34:04
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 22:35:32
Post #8





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 22:40:06
Post #9





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


  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.
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 22:43:34
Post #10





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 22:47:38
Post #11





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


  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.
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 22:50:50
Post #12





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 22:54:06
Post #13





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


Czyli mam dodać ORDER BY drugi raz po GROUP BY? Wtedy zwraca mi błąd.
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 22:56:05
Post #14





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 22:57:15
Post #15





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


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

Ten post edytował Vafel 3.10.2011, 22:57:30
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 22:58:59
Post #16





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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

Ten post edytował tehaha 3.10.2011, 23:00:38
Go to the top of the page
+Quote Post
Vafel
post 3.10.2011, 23:03:30
Post #17





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


  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'
Go to the top of the page
+Quote Post
tehaha
post 3.10.2011, 23:07:15
Post #18





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


w podzapytaniu czyli w tym nawiasie dodaj kolumnę post_id czyli SELECT post_id, user_agent
Go to the top of the page
+Quote Post
Vafel
post 5.10.2011, 19:41:02
Post #19





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.10.2011

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


  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?
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: 6.07.2025 - 09:09