Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z sortowaniem przed grupowaniem
menda90
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 22.11.2008

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


Witam, wiem że temat był dużo razy poruszany ale nadal nie potrafię zastosować go do swoich potrzeb.
Mam tabelę:
  1. CREATE TABLE IF NOT EXISTS `wiadomosci` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `grupa` int(11) NOT NULL,
  4. `wiadomosc` varchar(2048) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  5. `from_id` int(11) NOT NULL,
  6. `to_id` int(11) NOT NULL,
  7. PRIMARY KEY (`id`)
  8. );
  9.  
  10.  
  11. INSERT INTO `wiadomosci` (id, grupa, wiadomosc, from_id, to_id) VALUES (`1`, `1`, `Witam`,`20`,`30`);
  12. INSERT INTO `wiadomosci` (id, grupa, wiadomosc, from_id, to_id) VALUES (`2`, `1`, `Witam2`,`20`,`30`);
  13. INSERT INTO `wiadomosci` (id, grupa, wiadomosc, from_id, to_id) VALUES (`3`, `2`, `Witam3`,`22`,`30`);
  14. INSERT INTO `wiadomosci` (id, grupa, wiadomosc, from_id, to_id) VALUES (`4`, `2`, `Witam4`,`30`,`22`);
  15. INSERT INTO `wiadomosci` (id, grupa, wiadomosc, from_id, to_id) VALUES (`5`, `2`, `Witam5`,`22`,`30`);


i chcę wyciągnąć najświeższą wiadomość dla id uzytkownika="30" , gdzie grupowanie jest po polu "grupa", a najświeższa wiadomość to ta, która ma największe "id".

  1. SELECT wiadomosc FROM wiadomosci WHERE from_id=30 OR to_id=30 GROUP BY grupa ORDER BY id DESC

wyciąga mi
  1. Witam
  2. Witam3

a potrzebne
  1. Witam2
  2. Witam5

jakiś pomysł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Dlaczego potrzebujesz grupowania?

Używanie w select nazw kolumn, które nie są objęte ani funkcją agregującą ani nie są w group by jest dozwolone w mysql, ze względów wydajnościowych, ale nie jest to poprawna składnia tradycyjnego SQL. Na przykład próbując takie samo zapytanie w MSSQL dostałbyś znany chyba wszystkim, którzy z sql serverem mieli do czynienia błąd:
Column 'wiadomosc' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Mysql pozwala na takie rzeczy, takie kolumny nazywając ukryte (hidden), ale wartość, którą zwraca select jest pewna tylko jeśli wszystkie wiersze w obrębie tej samej grupy mają ją identyczną.
http://dev.mysql.com/doc/refman/5.6/en/gro...en-columns.html

W twoim przypadku, ponieważ kolumna wiadomosc nie występuje w group by (tam jest tylko grupa), nie wykonujesz też na tej wiadomości nic takiego jak sumowanie, zliczanie, czy cokolwiek z listy funkcji agregujących http://dev.mysql.com/doc/refman/5.6/en/gro...-functions.html, nie możesz mieć absolutnie żadnej pewności z którego rekordu mysql zwróci wartość kolumny wiadomosc.

Żeby stwierdzić jak dokładnie musisz zbudować zapytanie musisz najpierw precyzyjnie odpowiedzieć na pierwsze pytanie.

Ten post edytował pmir13 27.04.2011, 20:36:53
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 13:46