Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: GROUP BY & ORDER BY
Forum PHP.pl > Forum > Bazy danych > MySQL
kask18
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
Mchl
A po co tutaj GROUP BY skoro nie ma żadnych funkcji agregujących?
kask18
to co mam użyć questionmark.gif żeby nazwa była tylko raz i żeby zachować sortowanie questionmark.gif jakieś propozycje questionmark.gif
erix
DISTINCT dry.gif
kask18
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.
Pilsener
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.
kask18
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 ?
Mchl
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)
kask18
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) ?
Mchl
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
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.