Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: group by
Forum PHP.pl > Forum > Bazy danych
php programmer
dlaczego posgres nie akceptuje zapytania
  1. SELECT *
  2. FROM tabela
  3. GROUP BY pole

podczas gdy na innej mojej stronie w MySQL
podobne zapytanie nie stwarza problemu

taki błąd:
Cytat
id must appear in the GROUP BY clause or be used in an aggregate function

tylko ze ja wcale nie mam potrzeby używania dodatkowo funkcji agregujacej
więc po co posgres mi wciśka mi to na siłe
FiDO
Bo mysql nie rzuca warninga tylko po prostu dobiera sobie dla reszty pol "jakis" wiersz dla kazdej grupy, ale nigdy nie masz pewnosci czy to bedzie pierwszy czy ostatni, wiec polegac na tym nie mozna. Inne bazy mowia jasno, ze takie cos nie przejdzie, bo w zasadzie nie powinno..
Napisz co chcesz konkretnie wyciagnac to mozna pomyslec jak to zapisac prawidlowo.
tort
Generalna zasada jest taka, że GROUP BY powinno wystąpic w zapytaniu wówczas, gdy używasz w nim funkcji agregujących. Ponieważ takiej funkcji nie używasz, więc PostgreSQL się buntuje.

A poza tym jestes pewien, że gdy piszesz
  1. SELECT *
  2. FROM tabela
  3. GROUP BY pole

nie chodzi ci po prostu o
  1. SELECT *
  2. FROM tabela
  3. ORDER BY pole
?
SongoQ
Grupowanie jak sama nazwa wskazuje grupuje takie same rekordy, dodatkowo z funkcjami agregacji mozna uzyc do zwracania ilsoci w grupie.
tort
A tu taki link do skroconego wyjaśnienia sensu GROUP BY: http://www.w3schools.com/sql/sql_groupby.asp
php programmer
Chcę grupowąć ponieważ mam jedno pole które mówi do jakiej grupy należy cały wiersz tj czy film jest komedia,dramat,horror itp
i chce po prostu wyświetlić najpierw
wszystkie rodzaje filmu wiec grupuje według rodzaju filmu

Chciałbym otrzymać, coś takiego:

Wybiersz rodzaj filmu:
- komedia
- dramat
- horror
- itd

(potem jak klikne na pierwsze to sie wyswietlą wszytstkie komedie itd, ale to już inna sprawa)

ps. jeszcze jedna uwaga, jak zrobie
  1. SELECT film_id,SUM(film_id)
  2. FROM kinoffteka_forum
  3. GROUP BY film_id
to jest ok, ale jak juz zrobie
  1. SELECT film_id,SUM(film_id),*
  2. FROM kinoffteka_forum
  3. GROUP BY film_id
to juz wyskakuje błąd

tzn jak on każe grupować mi wszystkie pola, ale przecież ja właśnie nie chce grupować wszystkich pól tylko jedno,
tort
Cytat
Chcę grupowąć ponieważ mam jedno pole które mówi do jakiej grupy należy cały wiersz tj czy film jest komedia,dramat,horror itp
i chce po prostu wyświetlić najpierw
wszystkie rodzaje filmu wiec grupuje według rodzaju filmu


A to nie lepiej zrobić:
  1. SELECT DISTINCT grupa_filmow
  2. FROM filmy

jeśli masz jakieś pole z ograniczoną liczbą wartości (odpowiednik MySQLowego ENUM), albo
  1. SELECT id, nazwa
  2. FROM grupy_filmow

jeśli masz tabelę z grupami powiązana z tabelą z filmami?


Cytat
jak juz zrobie
  1. SELECT film_id,SUM(film_id),*
  2. FROM kinoffteka_forum
  3. GROUP BY film_id
  to juz wyskakuje błąd

Możesz przyjąć jako ogólną zasadę, że grupować musisz po tym, co jest w SELECT, więc jak masz *, to musisz grupowac po każdej kolumnie.
mike
~php programmer proszę natychmiast poprawiś oba swoje powyższe posty stosując odpowiedni bbCode.

O tej chwili nie będzie próśb a każde odstępstwo od Reguaminu w ramach stosowania poprawnego bbCode'a przez Ciebie karane będzie ostrzeżeniem.
php programmer
tort
  1. SELECT DISTINCT grupa_filmow
  2. FROM filmy
to jest ok tylko ma jedną wadę, jak dodam inne pola zeby wybierał to juz zapytanie napiera innego charakteru tzn bierze wiecej wierszy niż bym chciał, z kolei to zapytanie ktore działa dobrze tzn bierze odpowiednia ilosc wierszy ale nie mam widocznych wszystkich pol tj tytuł filmu,
Wiesz może jak zrobić żeby to zapytanie miało taki sam sens ale zwracało mi cały wiersz a nie tylko kolumnę grupa_filmów?
ps. co do rozwiazania z druga tabelą w moim przypadku to nie było by optymalne tzn ta druga tabela oczywiscie istnieje, ale rodzajów filmów mam bardzo dużo natomiast w mojej tabeli którą przszukuje jest póki co kilkanaście pól
dr_bonzo
Cytat
Chcę grupowąć ponieważ mam jedno pole które mówi do jakiej grupy należy cały wiersz tj czy film jest komedia,dramat,horror itp
i chce po prostu wyświetlić najpierw
wszystkie rodzaje filmu wiec grupuje według rodzaju filmu

O to chodzi:
  1. SELECT *
  2. FROM tabela
  3. ORDER BY typ_filmu ASC|DESC

przeciez to tylko sortowanie

-----------
Sorry - pomylilem sie.

Rozwiazanie tort'a bedzie ok.
  1. SELECT DISTINCT grupa_filmow
  2. FROM filmy
php programmer
Nie nie chodzi mi o to, jak bym napisał tak jak podałeś
to bym dostał kilka tych samych typów,

ale ok teraz sie zorientowałem, że przecież wcale nie chce tytułu przecież chcę jedynie rodzaje filmów, sorki wprowadziłęm was w błąd

po prostu troche co innego robie ale dałem inny przykład żeby uprościć
tak naprawde mam tabele froum z kometarzami do filmów czyli jest pole film_id (ale dla uproszczenia nazwałem tu to jako kategorię) i poprostu chciałem aby wyswietliła sie lista wszystkich filmow różnych a po kliknieciu na film wyswietlały by się kometarze dla tego filmu OK

w końcu moje zapytanie wygląda tak
  1. SELECT DISTINCT film_id,tytul
  2. FROM kinoffteka_forum
  3. f,kinoffteka_www w WHERE f.film_id=w.id


i chyba juz dorze działa, na pierwszy rzut oka
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.