Thread View: pl.comp.bazy-danych
8 messages
8 total messages
Started by Marek
Tue, 22 Sep 2015 11:14
PostgreSQL - jak zredagować SQL?
Author: Marek
Date: Tue, 22 Sep 2015 11:14
Date: Tue, 22 Sep 2015 11:14
21 lines
1419 bytes
1419 bytes
Witam, Mam zapytanie działające w skrócie w/g schematu: UPDATE ratings SET games=games+1, ... , FROM user ... (subquery) Sprawdziłem - subquery zwraca mi dwa rekordy co obrazowo można zapisać tak: UPDATE ratings SET games=games+1, ..., WHERE user_id IN (9,9); Kłopot w tym, że aktualizacja wykona się tylko raz a ja bym chciał aby wykonała się dwa razy bo użytkownik o ID 9 odbył dwa mecze a nie jeden. Jak to zapisać aby wykonało się więcej niż jeden raz? Zapytanie w oryginale jest rozbudowane, nie tylko zlicza gry ale jeszcze parę innych danych więc nie chce go przytaczać w całości. -- Pozdrawiam, Marek
Re: PostgreSQL - jak zredagować SQL?
Author: Marek
Date: Tue, 22 Sep 2015 13:59
Date: Tue, 22 Sep 2015 13:59
8 lines
1068 bytes
1068 bytes
P.S. Czy jedynym sposobem jest utworzenie SELECT rekordów w pętli np. w PHP i wielokrotne wykonywanie UPDATE zgodnie z danymi z powyższego SELECT'a? Nie da się tego w samym SQLu zrobić? -- Pozdrawiam, Marek
Re: PostgreSQL - jak zredagować SQL?
Author: Adam Klobukowski
Date: Tue, 22 Sep 2015 14:03
Date: Tue, 22 Sep 2015 14:03
13 lines
1668 bytes
1668 bytes
W dniu wtorek, 22 września 2015 15:59:29 UTC+2 użytkownik Marek napisał: > P.S. > Czy jedynym sposobem jest utworzenie SELECT rekordów w pętli np. w PHP i > wielokrotne wykonywanie UPDATE zgodnie z danymi z powyższego SELECT'a? > Nie da się tego w samym SQLu zrobić? > > -- > Pozdrawiam, > Marek Da się, dokładnie tak jak napisałeś. Eksperymentuj! AdamK
Re: PostgreSQL - jak zredagować SQL?
Author: Lesiok
Date: Tue, 22 Sep 2015 14:39
Date: Tue, 22 Sep 2015 14:39
28 lines
1869 bytes
1869 bytes
W dniu 2015-09-22 o 13:14, Marek pisze: > Witam, > > Mam zapytanie działające w skrócie w/g schematu: > > UPDATE ratings SET games=games+1, ... , FROM user ... (subquery) > > Sprawdziłem - subquery zwraca mi dwa rekordy co obrazowo można zapisać tak: > > > UPDATE ratings SET games=games+1, ..., WHERE user_id IN (9,9); > > Kłopot w tym, że aktualizacja wykona się tylko raz a ja bym chciał aby > wykonała się dwa razy bo użytkownik o ID 9 odbył dwa mecze a nie jeden. > Jak to zapisać aby wykonało się więcej niż jeden raz? > > Zapytanie w oryginale jest rozbudowane, nie tylko zlicza gry ale jeszcze > parę innych danych więc nie chce go przytaczać w całości. > UPDATE ratings SET games=games+(wylicyć o ile zapewne analogicznie jak to tajemnicze subquery) A tak w ogóle to aż się prosi o triger aktualizujący automatycznie te dane. -- Pozdrawiam, Leszek Kubrak
Re: PostgreSQL - jak zredagować SQL?
Author: hubert depesz lubaczewski
Date: Wed, 23 Sep 2015 08:42
Date: Wed, 23 Sep 2015 08:42
34 lines
2067 bytes
2067 bytes
On 2015-09-22, Marek <precz@spamowi.com> wrote:
> Witam,
>
> Mam zapytanie działające w skrócie w/g schematu:
>
> UPDATE ratings SET games=games+1, ... , FROM user ... (subquery)
>
> Sprawdziłem - subquery zwraca mi dwa rekordy co obrazowo można zapisać tak:
>
>
> UPDATE ratings SET games=games+1, ..., WHERE user_id IN (9,9);
>
> Kłopot w tym, że aktualizacja wykona się tylko raz a ja bym chciał aby
> wykonała się dwa razy bo użytkownik o ID 9 odbył dwa mecze a nie jeden.
> Jak to zapisać aby wykonało się więcej niż jeden raz?
> Zapytanie w oryginale jest rozbudowane, nie tylko zlicza gry ale jeszcze
> parę innych danych więc nie chce go przytaczać w całości.
załóżmy, że subquery zwraca kolumnę nazywającą się user_id.
wtedy:
with users_to_update as ( subquery ),
update_by as (select user_id, count(*) from users_to_update group by
user_id)
update ratings r
set games = r.games + x.count
from update_by as x
where x.user_id = r.user_id;
depesz
--
The best thing about modern society is how easy it is to avoid contact with it.
http://depesz.com/
Re: PostgreSQL - jak zredagować SQL?
Author: Marek
Date: Thu, 24 Sep 2015 09:34
Date: Thu, 24 Sep 2015 09:34
10 lines
1134 bytes
1134 bytes
W dniu 2015-09-22 o 16:03, Adam Klobukowski pisze: > > Da się, dokładnie tak jak napisałeś. Eksperymentuj! Dzięki za cenną wskazówkę. -- Pozdrawiam, Marek
Re: PostgreSQL - jak zredagować SQL?
Author: Marek
Date: Thu, 24 Sep 2015 10:00
Date: Thu, 24 Sep 2015 10:00
46 lines
2674 bytes
2674 bytes
W dniu 2015-09-22 o 16:39, Lesiok pisze: > UPDATE ratings SET games=games+(wylicyć o ile zapewne analogicznie jak > to tajemnicze subquery) Oki, mogę oczywiście zliczać dane countem jednakże kolumn jest więcej. Chodzi o coś w rodzaju statystyk piłkarskich. Jest tabela kto z kim grał i ile drużyny zdobyły umownie "bramek" w każdym ze spotkań. Trzeba zliczyć ile dana drużyna miała spotkań, ile wygranych, ile przegranych, różnicę "bramek" i jeszcze jakieś punktacje itp. Czyli w skrócie na podstawie tabeli: CREATE TABLE players ( players_id SERIAL PRIMARY KEY, player_a_id int4 NOT NULL, player_b_id int4 NOT NULL, a_result int4, b_result int4, (...) FOREIGN KEY (player_a_id) REFERENCES users (users_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (player_b_id) REFERENCES users (users_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE ); W dodatku gracz może być graczem A jak i B w zależności od spotkania. Oba te warianty dzielę na dwa różne zapytania aby zupełnie się nie zakręcić. Stąd pomysł posłużenia się tabelą tymczasową - jak niżej. > A tak w ogóle to aż się prosi o triger aktualizujący automatycznie te dane. Dane są typu live. Musiałbym wyliczyć stan początkowy, zatrzymać aplikację, a potem otriggerować tabelę i uruchomić. Ponadto z czasem może okazać się, że klient będzie chciał jeszcze inne dane statystyczne oglądać. Za bardzo złożone. Trzeba więc analizować dane na zasadzie statystycznej. Zakładam więc tabelę tymczasową i w niej zliczam co trzeba. Póki co nieudolnie na zasadzie pętli w PHP z napędzającym selectem a w niej szeregu updateów. -- Pozdrawiam, Marek
Re: PostgreSQL - jak zredagować SQL?
Author: Marek
Date: Thu, 24 Sep 2015 10:12
Date: Thu, 24 Sep 2015 10:12
16 lines
1316 bytes
1316 bytes
> > wtedy: > with users_to_update as ( subquery ), > update_by as (select user_id, count(*) from users_to_update group by > user_id) > update ratings r > set games = r.games + x.count > from update_by as x > where x.user_id = r.user_id; Sprytne! Właśnie podobnie z tym WITH'em kombinowałem lecz zawsze jakaś pułapka mnie przytrzasnęła - dziś przeeksperymentuję w/w wariant i dam znać. -- Pozdrawiam, Marek
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads