Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> group by i order by
1992bartekk
post 1.01.2015, 02:09:51
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 7.12.2014

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


Witam posiadam zapytanie do bazy:

  1. SELECT
  2. mkd53_message.user_id, mkd53_message.friend_id, mkd53_konto.photo, mkd53_konto.imie, mkd53_konto.nazwisko,
  3. mkd53_message.DATA, mkd53_message.results, mkd53_message.wiadomosc
  4. FROM
  5. mkd53_konto, mkd53_message
  6. WHERE
  7. mkd53_message.friend_id='$user_ID' AND mkd53_konto.user_id=mkd53_message.user_id
  8. GROUP BY mkd53_message.user_id
  9. ORDER BY mkd53_message.id DESC



W konsekwencji dostaję pogrupowane wyniki tylko kolejnosć wyników jest odwrotna od tych ktre chcę otrzymać. Jak musze przekształcić ten kod by kolejność wyników była odwrotna.
Go to the top of the page
+Quote Post
fate
post 1.01.2015, 09:10:55
Post #2





Grupa: Zarejestrowani
Postów: 824
Pomógł: 106
Dołączył: 14.03.2012
Skąd: Warszawa

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


ORDER BY mkd53_message.id ASC


--------------------
Go to the top of the page
+Quote Post
1992bartekk
post 1.01.2015, 12:55:16
Post #3





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 7.12.2014

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


Fate to było by za proste wink.gif
nie oto mi chodziło, raczej by treść którą ma mi wyświetlić była od najnowszych.

mam np. tabele:

id | u | f | message
1 | 1 | 2 | tresc 1
2 | 3 | 1 | tresc 2
3 | 2 | 1 | tresc 3
4 | 2 | 1 | tresc 4


chcę by wyświetlało mi zapytanie bez powtórzeń. Załóżmy że moje u=1, f=1 zatem powinienem otrzymać wynik:
2 | 3 | 1 | tresc 2
4 | 2 | 1 | tresc 4

jak widać wykluczony został wynik:
3 | 2 | 1 | tresc 3

Mój kod wyklucza wyniki jednak nie wybiera ich według kolejności jakiej bym chciał.

Mój dotychczasowy kod da mi wynik:

2 | 3 | 1 | tresc 2
3 | 2 | 1 | tresc 3

Czyli pobierze już starszy wynik dodany przez u=2

Ten post edytował 1992bartekk 1.01.2015, 13:36:51
Go to the top of the page
+Quote Post
pmir13
post 1.01.2015, 20:42:27
Post #4





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

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


Ogólna zasada jest taka, że jeśli używamy GROUP BY, to do SELECT możemy wrzucić tylko kolumnę, według której grupujemy (lub jeśli grupujemy po kombinacji to tylko te kolumny) oraz wyrażenia zawierające funkcje agregujące z innymi kolumnami.

Mysql jest jedyną bazą, która nie pluje się na użycie dodatkowych kolumn - inne po prostu zwrócą syntax error, ale idą za tym ograniczenia - do wszystkich pozostałych kolumn bierze pierwsze z brzegu wartośći dla każdej grupy, mając przy tym całkowitą dowolność, najczęściej bierze więc wartości z tych rekordów, dla których wykona najmniej operacji I/O na dysku. Jeśli w każdej grupie dla danej kolumny mamy identyczne wartości to problemu nie ma, ale jeśli są różne to nie mamy absolutnie żadnej możliwości wpływania na rezultat, w szczególności ORDER BY na wynik nie wpływa, bo sortuje gotowe rekordy dawno po tym, jak do każdej grupy zostały wzięte jakieś wartości. Nawet jeśli chwilowo wyniki mogą się zgadzać z naszymi oczekiwaniami to proste zmiany w indeksach mogą nam mocno namieszać.

Należałoby najpierw znaleźć najnowszą wiadomość dla każdego usera - czyli z tabeli message SELECT user_id, MAX(id) przy GROUP BY user_id, czyli jesteśmy całkowicie pewni wszystkich wyników - user_id siedzi w GROUP BY, a MAX() jest funkcją agregującą, następnie ponownie dołączyć message wg tych dwóch kolumn by otrzymać odpowiadającą im treść wiadomości i dołączyć również tabelę konto by mieć pozostałe informacje o userze z danym user_id.
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: 14.06.2024 - 09:36