Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> GROUP BY & ORDER BY
kask18
post
Post #1





Grupa: Zarejestrowani
Postów: 121
Pomógł: 0
Dołączył: 3.12.2008

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


mam takie zapytanie :
  1. SELECT id_producenci, nazwa, email, typ_osoby FROM firmy_producenci f INNER JOIN osoba o
  2. ON o.Firmy_producenci_id_producenci = f.id_producenci GROUP BY nazwa
  3. ORDER BY f.nazwa ASC, o.typ_osoby ASC;


Z tym że jak wrzucam GROUP BY nazwa przed ORDER BY... to działa jedynie ORDER BY f.nazwa ASC.
Po o.typ_osoby ASC już nie sortuje. Ta się w ogóle tak zrobić żeby orderować po kilku atrybutach i wykorzystać zarazem GROUP BY questionmark.gif Z góry dzięki za pomoc
Go to the top of the page
+Quote Post
Mchl
post
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


A po co tutaj GROUP BY skoro nie ma żadnych funkcji agregujących?
Go to the top of the page
+Quote Post
kask18
post
Post #3





Grupa: Zarejestrowani
Postów: 121
Pomógł: 0
Dołączył: 3.12.2008

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


to co mam użyć questionmark.gif żeby nazwa była tylko raz i żeby zachować sortowanie questionmark.gif jakieś propozycje questionmark.gif

Ten post edytował kask18 14.07.2010, 22:54:14
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




DISTINCT dry.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
kask18
post
Post #5





Grupa: Zarejestrowani
Postów: 121
Pomógł: 0
Dołączył: 3.12.2008

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


Przecież w podanym przeze mnie zapytaniu pobieram kilka atrybutów (id_producenci, nazwa, email, typ_osoby) a nie tylko jeden a DISTINCT zwróci mi tylko są nazwe . Może sie nie precyzyjnie wyraziłem chodzi o pobranie: d_producenci, nazwa, email, typ_osoby z warunkami sortowania i żeby nazwy pojawiały sie tylko raz coś takiego jak z GROUP BY tylko na 2 sortowaniach mi nie działa.
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
żeby orderować po kilku atrybutach i wykorzystać zarazem GROUP BY
- nie da się w ten sposób. Nie masz wpływu na to, w jakiej kolejności są grupowane rekordy, jeśli typ_osoby jest agregowany i chcesz, by zagregowany został tylko np. typ_osoby o najwyższym IQ, to musisz użyć podzapytania lub warunków w JOIN albo zrezygnować z grupowania i poradzić sobie przy pomocy HAVING (ale to też jest skomplikowane, pewnie trzeba będzie użyć zmiennych). Jeśli interesuje Ciebie tylko konkretny rekord z JOINowanej tabeli to najlepiej tylko ten rekord pobrać od razu, na pewno będzie też szybciej i zajmie mniej pamięci.
Go to the top of the page
+Quote Post
kask18
post
Post #7





Grupa: Zarejestrowani
Postów: 121
Pomógł: 0
Dołączył: 3.12.2008

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


A czy istnieje możliwość aby zbudować takiego WHERE żeby dla danej nazwy jeśli istnieje typ osoby = 1 to żęby zwróciło ten rekord dla danej nazwy, jeśli nie ma 1 to żeby zwróciło jeśli jest typ osoby 0 w takiej kolejności jak opisałem. Chodzi o jakieś proste rozwiązanie ?
Go to the top of the page
+Quote Post
Mchl
post
Post #8





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Kod
SELECT * FROM osoba WHERE typ_osoby IN (0,1) ORDER BY typ_osoby DESC LIMIT 1


Teraz możesz to wstawić jako podzapytanie do swojego zapytania powyżej (i wywalić group by).

Chciałaby dusza do nieba, ale to nic nie da. Potrzebujesz przecież listę osób ze wszystkich firm winksmiley.jpg

Kod
SELECT
  *
FROM
  osoba
CROSS JOIN (
  SELECT
    Firmy_producenci_id_producenci, MAX(typ_osoby) AS typ_osoby
  FROM
    osoba
  WHERE
    typ_osoby IN(0,1)
  GROUP BY
    Firmy_producenci_id_producenci
  ) AS sq
USING (Firmy_producenci_id_producenci, typ_osoby)


Ten post edytował Mchl 15.07.2010, 09:29:00
Go to the top of the page
+Quote Post
kask18
post
Post #9





Grupa: Zarejestrowani
Postów: 121
Pomógł: 0
Dołączył: 3.12.2008

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


Skrobłem coś takiego:
  1. SELECT id_producenci, nazwa, email, typ_osoby FROM (SELECT * FROM osoba
  2. ORDER BY typ_osoby ASC) AS o
  3. INNER JOIN firmy_producenci f ON o.Firmy_producenci_id_producenci = f.id_producenci
  4. GROUP BY Firmy_producenci_id_producenci ORDER BY nazwa


Działa tak jak chciałem, alle nie wiem czy to dobre rozwiązanie (optymalne) ?
Go to the top of the page
+Quote Post
Mchl
post
Post #10





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Mnie się nie podoba osobiście. GROUP BY bez funkcji agregujących może rzucać błędami przy pewnej konfiguracji MySQL.

http://dev.mysql.com/doc/refman/5.0/en/ser...y_full_group_by
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 Aktualny czas: 21.08.2025 - 12:19