Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL]zapytanie z GROUP BY albo DISTINCT
Forum PHP.pl > Forum > Przedszkole
ilkar
Hej

Mam problem

posiadam baze danych z np forum, wpisy są następujące:

id | user_id | content | title | date
1 1 adfasf asd data
2 2 adfasf asd data
3 2 adfasf asd data
4 3 adfasf asd data
5 1 adfasf asd data
6 2 adfasf asd data

chcialem zrobic zapytanie, ktore zwracalo by mi ostatnich 10 uzytkownikow ktorzy wpisali cos na forum.
Stworzylem proste zapytanie z GROUP BY:
SELECT * FROM forum GROUP BY user_id ORDER BY id DESC LIMIT 10, 0
i problemem jest to, ze zapytanie zwraca mi nieprawidłową kolejność, ponieważ zgodnie z moim mysleniem powinno zwrocic mi uzytwkonikow w nastepujacej kolejnosci:

user_id
2
1
3

//poniewaz ostatni wpis zgodnie z id umiescil uzytkownik nr 2

a zwraca

user_id
3
2
1

Co powinienem z tym zrobic?
Skie
A tych wpisów jest tam może więcej?
Z tego co pamiętam to poprawnie zapisane zapytanie LIMIT wygląda tak:

  1. LIMIT nr_rekordu, ilosc_rekordow


Twój przykład pobiera 0 rekordów? (więc pewnie baza traktuje to jako wszystkie), zaczynając od 10-tego rekordu. A Ty chyba chcesz pobrać 10 rekordów zaczynając od pierwszego
A więc to zapytanie powinno tak wyglądać:

  1. SELECT * FROM forum GROUP BY user_id ORDER BY id DESC LIMIT 0, 10


Poza tym nie jestem pewien czy GROUP BY nie powinno być po ORDER BY, więc jakby to wyżej nie działało to spróbuj także:

  1. SELECT * FROM forum ORDER BY id DESC GROUP BY user_id LIMIT 0, 10
Maveral
Ale jeśli chcesz tylko ostatnich użytkowników, to chyba nie musisz tego grupować tylko wywalić ich ID (chyba dobrze zrozumiałem?):

  1. SELECT user_id FROM forum ORDER BY id DESC LIMIT 0, 10
Skie
Musi je grupować, gdyż id to jest pole id tych wpisów czy czegoś tam, a on chce pobrać user_id.
ilkar
Cytat(Maveral @ 8.06.2009, 16:20:04 ) *
Ale jeśli chcesz tylko ostatnich użytkowników, to chyba nie musisz tego grupować tylko wywalić ich ID (chyba dobrze zrozumiałem?):

  1. SELECT user_id FROM forum ORDER BY id DESC LIMIT 0, 10


musze pogrupowac, poniewaz potrzebuje unikalnych id uzytkownikow...
Skie
A co z tym co Ci podałem? Działa / nie działa?
ilkar
Cytat(Skie @ 8.06.2009, 16:27:23 ) *
A co z tym co Ci podałem? Działa / nie działa?


niestety kolejnosc: SELECT * FROM forum GROUP BY user_id ORDER BY id DESC LIMIT 0 ,10 jest poprawna, jezeli zamienie order z group, bo wyskakuje blad...

Problem w tym, ze rzeczywiscie najpierw grupuje, a pozniej pobiera, dzieki czemu nie widzi ostatniego rekordu jako ostatniego, bo grupuje od początku listy, czyli od pierwszego id....

nie wiem co z tym zrobic...
kefirek
A tak nie możesz ?

  1. SELEC *, COUNT(user_id) AS ile FROM forum GROUP BY user_id ORDER BY ile DESC
ilkar
Cytat(kefirek @ 8.06.2009, 17:00:57 ) *
A tak nie możesz ?

  1. SELEC *, COUNT(user_id) AS ile FROM forum GROUP BY user_id ORDER BY ile DESC


to jest super zapytanie, dzieki bardzo

Cytat(kefirek @ 8.06.2009, 17:00:57 ) *
A tak nie możesz ?

  1. SELEC *, COUNT(user_id) AS ile FROM forum GROUP BY user_id ORDER BY ile DESC


ale problem w tym, ze tutaj robisz ORDER po uzytkownikach, ktorzy napisali najwiecej postow, a ja chce, po tych, ktorzy ostatni napisali posty bez wzgledu na ilosc napisanych postow
kefirek
to dajesz by po dacie sortowało
  1. ORDER BY date DESC
ilkar
Cytat(kefirek @ 8.06.2009, 17:16:44 ) *
to dajesz by po dacie sortowało
  1. ORDER BY date DESC


po dacie zle sortuje... mam do dyspozycji date i time (w formacie H:m:i)...
kefirek
Podaj przykładową date jaką masz w pole date ? I jaki typ kolumny date jest
ilkar
Cytat(kefirek @ 8.06.2009, 17:40:31 ) *
Podaj przykładową date jaką masz w pole date ? I jaki typ kolumny date jest


date: 2009-05-10 typ (date)
time: 15:30:10 typ (varchar)
kefirek
Może tak ?

  1. SELECT CONCAT(date, ' ', time) AS razem FROM forum GROUP BY user_id ORDER BY razem DESC
ilkar
Cytat(kefirek @ 8.06.2009, 21:13:19 ) *
Może tak ?

  1. SELECT CONCAT(date, ' ', time) AS razem FROM forum GROUP BY user_id ORDER BY razem DESC


nie...

zwraca tylko date z godzina, ale rownież źle, ostatni wpis mam np o 16:21 , a ten zwrocil mi, ze ostatni jest o 16:17
Maveral
Problem jest w tym, że sql przeszukuje bazę od początku, a potem dopiero odwraca tabelę wynikową (DESC). Mnie udało się tylko znaleźć unikalnych userów, ale od początku tabeli, więc jeśli "Kowalski" napisał pierwszego i ostatniego newsa w serwisie, to "ORDER BY ... ASC" go nie wyświetli, tylko wyświetli ostatnich 10 userów, którzy napisali coś po raz pierwszy.

  1. SELECT * FROM ksiega GROUP BY imie ORDER BY DATA, id DESC LIMIT 0, 10"


Gdyby dało się jakoś sprawić, aby sql przeszukiwał tabelę od końca, to by działało.
erix
  1. SELECT CAST(CONCAT(date, ' ', time) AS DATETIME) AS razem FROM forum GROUP BY user_id ORDER BY razem DESC

?

A mogę spytać, po co grupujesz rekordy?
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.