[mssql] zapytanie z grupowaniem
aaawro - 09-09-2007 00:04
[mssql] zapytanie z grupowaniem
Witam. Robię coś na kształt bazy pomysłów. Użytkownicy mogą dodawać swoje pomysły, edytować je. Później są one opiniowane przez użytkowników wyższych rangą. Rzecz w tym, że każda edycja tego pomysłu musi być zapisywana. I tak mam tabelę:
T: Pomysly a- pomysl_id b- watek_id c - numer_edycji d- <dużo innych atrybutów>...
a | b | |c | d.. 1 1 1 2 1 2 3 1 3 4 2 1
I teraz jak wyciągnąć wszystkie pomysły które są ostatnimi wersjami tych pomysłów? Coś w stylu dla każego 'b' tam gdzie jest największa wartość w 'c' ? dzięki z góry za jakieś naprowadzenie. Miłosz
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Sylwester Lewandowski - 09-09-2007 00:04
Hej,
Może:
SELECT P1.a,P1.b,P1.c,P1.d FROM Pomysly P1 WHERE c = (SELECT MAX(c) FROM Pomysly P2 WHERE P1.a=P2.a)
Zakładam, że kolejne wersje tego samego pomysłu mają takie samo pomysl_id i zwiększany jest numer edycji z kolejną edycją.
Pozdr.
aaawro pisze: > Witam. > Robię coś na kształt bazy pomysłów. Użytkownicy mogą dodawać swoje pomysły, > edytować je. Później są one opiniowane przez użytkowników wyższych rangą. > Rzecz w tym, że każda edycja tego pomysłu musi być zapisywana. > I tak mam tabelę: > > T: Pomysly > a- pomysl_id > b- watek_id > c - numer_edycji > d- <dużo innych atrybutów>... > > a | b | |c | d.. > 1 1 1 > 2 1 2 > 3 1 3 > 4 2 1 > > > I teraz jak wyciągnąć wszystkie pomysły które są ostatnimi wersjami tych > pomysłów? Coś w stylu dla każego 'b' tam gdzie jest największa wartość w 'c' ? > dzięki z góry za jakieś naprowadzenie. > Miłosz > >
=?ISO-8859-2?Q?Adam_P=B3aszczyca?= - 09-09-2007 00:04
On Sat, 8 Sep 2007 08:42:58 +0000 (UTC), " aaawro" <aaawro@gazeta.SKASUJ-TO.pl> wrote:
>T: Pomysly >a- pomysl_id >b- watek_id >c - numer_edycji >d- <dużo innych atrybutów>... > >a | b | |c | d.. >1 1 1 >2 1 2 >3 1 3 >4 2 1 > > >I teraz jak wyciągnąć wszystkie pomysły które są ostatnimi wersjami tych >pomysłów? Coś w stylu dla każego 'b' tam gdzie jest największa wartość w 'c' ?
Select pomysl_id, max(numer_edycji) from Pomysly group by pomysl_id; -- ___________ (R) /_ _______ Adam 'Trzypion' Płaszczyca (+48 502) 122 688 ___/ /_ ___ ul. Na Szaniec 23/70 31-560 Kraków (012 378 31 98) _______/ /_ http://trzypion.oldfield.org.pl/wieliczka/foto.html ___________/ mail: _555@irc.pl GG: 3524356
aaawro - 09-09-2007 00:04
Testuje to na razie pod MySQLem i pierwsze i drugie rozwiązanie zwraca wszystkie wiersze. Zamiast tylko te z pomysl_id = 3 lub 4 bo to są ostatnie wersje. Wątek 1 edytowany 3 raz i na razie ostatni. I wątek 2 edytowany tylko raz. Chyba że max() pod mssqlem i mysqlem ma inne właściwości.
pozdrawiam, Miłosz
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Sylwester Lewandowski - 09-09-2007 00:38
Hej,
Czy może pomysl_id to PK w tej tabeli? Wtedy najprawdopodobniej te zapytania będą działać tak, jak opisałeś. Założeniem tego co napisałem było, że pomysyl_id jest wspólny dla kolejnych wersji (a inne kolumny mogą się różnić, dlatego nie było 'prostego' GROUP BY).
Podaj jaki jest PK w tej tabeli i określ, które wartości są wspólne dla różnych wersji tego samego pomysłu.
Pozdr.
aaawro pisze: > Testuje to na razie pod MySQLem i pierwsze i drugie rozwiązanie zwraca > wszystkie wiersze. Zamiast tylko te z pomysl_id = 3 lub 4 bo to są ostatnie > wersje. Wątek 1 edytowany 3 raz i na razie ostatni. I wątek 2 edytowany tylko raz. > Chyba że max() pod mssqlem i mysqlem ma inne właściwości. > > pozdrawiam, > Miłosz >
aaawro - 10-09-2007 00:03
Sylwester Lewandowski <camlan_remove_@vp.pl> napisał(a):
> Hej, > > Czy może pomysl_id to PK w tej tabeli?
Tak to jest PK w tej tabeli. Autonumeracja.
> Podaj jaki jest PK w tej tabeli i określ, które wartości są wspólne dla > różnych wersji tego samego pomysłu.
watek_id - to jest wspolne dla danego pomyslu. numer_edycji - to jest numer edycji danego pomyslu
czyli wprowadzam pomysl, - pomysl_id =1, watek_id =1, numer_edycji =1
edytuje pomysl, - pomysl_id =2, watek_id =1 (nie zmienia sie bo to ten sam pomysl), numer_edycji =2
jeszcze raz edytuje pomysl, - pomysl_id =3, watek_id =1 (nie zmienia sie bo to ten sam pomysl), numer_edycji =3
dodaje nowy pomysl, - pomysl_id =4, watek_id =2 (zmienia sie bo to ten juz inny pomysl), numer_edycji =1 (1 edycja)
pozdrawiam, Miłosz
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
A.L.E.C - 10-09-2007 00:03
aaawro pisze: > Witam. > Robię coś na kształt bazy pomysłów. Użytkownicy mogą dodawać swoje pomysły, > edytować je. Później są one opiniowane przez użytkowników wyższych rangą. > Rzecz w tym, że każda edycja tego pomysłu musi być zapisywana. > I tak mam tabelę: > > T: Pomysly > a- pomysl_id > b- watek_id > c - numer_edycji > d- <dużo innych atrybutów>... > > a | b | |c | d.. > 1 1 1 > 2 1 2 > 3 1 3 > 4 2 1 > > > I teraz jak wyciągnąć wszystkie pomysły które są ostatnimi wersjami tych > pomysłów? Coś w stylu dla każego 'b' tam gdzie jest największa wartość w 'c' ? > dzięki z góry za jakieś naprowadzenie. > Miłosz
z opisu wynika, ze w zasadzie kolumna numer_edycji jest zbędna i poniższe zapytanie wystarczy
SELECT * FROM pomysly WHERE pomysl_id IN ( SELECT MAX(pomysl_id) FROM pomysly GROUP BY watek_id )
jezeli jednak bylaby istotna to trzeba pokombinować bardziej, w postgresie użyłbym po prostu DISTINCT ON
-- Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252 LAN Management System Developer http://lms.org.pl
Sylwester Lewandowski - 10-09-2007 00:03
aaawro pisze: > Sylwester Lewandowski <camlan_remove_@vp.pl> napisał(a): > >> Hej, >> >> Czy może pomysl_id to PK w tej tabeli? > > Tak to jest PK w tej tabeli. Autonumeracja. > >> Podaj jaki jest PK w tej tabeli i określ, które wartości są wspólne dla >> różnych wersji tego samego pomysłu. > > watek_id - to jest wspolne dla danego pomyslu. > numer_edycji - to jest numer edycji danego pomyslu >
Ok. W takim razie:
SELECT P1.a,P1.b,P1.c,P1.d FROM Pomysly P1 WHERE P1.c = (SELECT MAX(c) FROM Pomysly P2 WHERE P1.b=P2.b) lub
SELECT b, MAX(c) FROM Pomysly GROUP BY b
W drugim przypadku, to czy możesz dołączyć "d" zależy od ich zawartości. Chyba tym razem coś już powinno zaskoczyć. Pozdr.
aawro - 10-09-2007 00:03
A.L.E.C <amachniak@onet.pl> napisał(a):
> z opisu wynika, ze w zasadzie kolumna numer_edycji jest zbędna i > poniższe zapytanie wystarczy > > SELECT * FROM pomysly > WHERE pomysl_id IN ( > SELECT MAX(pomysl_id) > FROM pomysly > GROUP BY watek_id > )
dzięki o to chodziło, dziękuje również Sylwesterowi Lewandowskiemu. pozdrawiam, Miłosz
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[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?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
[sql][pgsql] zapytanie sql
zanotowane.pldoc.pisz.plpdf.pisz.pladwokat.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 |
|