Wybór unikalnych rekordów
Marek - 13-11-2006 00:45
Wybór unikalnych rekordów
Witam,
Mam chyba przyćmienie. Chcę wybrać produkt po 1 z danej kategorii a wynik posortować alfabetycznie w/g nazwy produktu. Nie mam pojęcia jak to zrobić... (PostgreSQL)
CREATE TABLE produkt ( .... category_id int4, name varchar(200) )
-- Pozdrawiam, Marek
Paweł Matejski - 13-11-2006 00:45
Marek wrote: > Witam, > > Mam chyba przyćmienie. Chcę wybrać produkt po 1 z danej kategorii a > wynik posortować alfabetycznie w/g nazwy produktu. Nie mam pojęcia jak > to zrobić... (PostgreSQL)
DISTINCT ON
-- P.M.
Marek - 13-11-2006 00:45
> DISTINCT ON
No właśnie to nie działa gdyż DISTINCT ON wymaga podania w ORDER BY w tej samej nazw kolumn. Więc jeśli chcę DISTINCT ON (category_id) to muszę zastosować ORDER BY category_id, name a nie tak jak bym chciał ORDER BY name, category_id. Wywala mi błąd przy odwróceniu tej kolejności.
Marek - 13-11-2006 00:45
PS
Poradziłem sobie lecz nie wiem czy jest to rozsądne posunięcie, choć w kontekscie Twojej odpowiedzi na moje pytanie zadane w innym wątku - może byc to słuszne podejście. Otóż obejście jest następujące:
SELECT * FROM produkt WHERE produkt_id IN ( SELECT DISTINCT ON (category_id) produkt_id FROM produkt WHERE ...
) ORDER BY name;
Pytanie zewnętrzne jest tylko protezą na obejście braku mozliwości posortowania w/g nazwy.
Paweł Matejski - 13-11-2006 00:45
Marek wrote: > No właśnie to nie działa gdyż DISTINCT ON wymaga podania w ORDER BY w tej > samej nazw kolumn. Więc jeśli chcę DISTINCT ON (category_id) to muszę > zastosować ORDER BY category_id, name a nie tak jak bym chciał ORDER BY name, > category_id. Wywala mi błąd przy odwróceniu tej kolejności.
I dlatego warto pisać zapytanie które się już zrobiło a nie działa tak jakbyś chciał.
> PS > > Poradziłem sobie lecz nie wiem czy jest to rozsądne posunięcie, choć w > kontekscie Twojej odpowiedzi na moje pytanie zadane w innym wątku - może > byc to słuszne podejście. Otóż obejście jest następujące: > > SELECT * FROM produkt WHERE produkt_id IN > ( > SELECT DISTINCT ON (category_id) produkt_id FROM produkt WHERE ... > > ) ORDER BY name; > > Pytanie zewnętrzne jest tylko protezą na obejście braku mozliwości > posortowania w/g nazwy.
Ja bym to zrobił tak:
select * from ( SELECT DISTINCT ON (category_id) * FROM produkt WHERE ... ORDER by category_id, <tu może być ważne> ) a order by name
A ten order wewnętrzny może być ważny, bo to on decyduje, który produkt zostanie wybrany z danej kategorii.
-- P.M.
Marek - 13-11-2006 00:45
Super ! Dzięki raz jeszcze ! :-)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
Jak =?ISO-8859-2?Q?zamieni=E6_dwa_pola_jednej_kolumny_?==?ISO-8859-2?Q?w_dw=F3ch_rekordach_za_pomoc=B1_jednego_zapyt? ==?ISO-8859-2?Q?ania=3F?=
=?ISO-8859-2?Q?WY=B6wietlenie_rekord=F3w_pocz=B1wszy_od_?==?I SO-8859-2?Q?danej_litery=2E=2E=2E?=
=?iso-8859-2?Q?=5BMySQL=5D_Wy=B6wietlenie_wszystkich_rekordow _zawierajacy?==?iso-8859-2?Q?ch_duplikat_a__moze_inna_struktura_bazy_danych ?=
[pgsql] Akcja w =?iso-8859-2?b?emFsZb9ub7ZjaQ==?= od liczby zmienionych =?iso-8859-1?q?rekord=F3w?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[mysql] Wyszukanie =?ISO-8859-2?Q?rekord=F3w=28powiazane_tabel?==?ISO-8859-2?Q?e=29?=
[MySQL]: Dodanie zliczania =?ISO-8859-2?Q?rekord=F3w_do_rozb?==?ISO-8859-2?Q?udowanego_zapytania?=
Liczba =?ISO-8859-2?Q?odpowiadaj=B1cych_rekord=F3w_z_drugi?==?ISO-8859-2?Q?ej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.plnumervin.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|