🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
8 messages
8 total messages Started by Marek Tue, 22 Sep 2015 11:14
PostgreSQL - jak zredagować SQL?
#194658
Author: Marek
Date: Tue, 22 Sep 2015 11:14
21 lines
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?
#194662
Author: Marek
Date: Tue, 22 Sep 2015 13:59
8 lines
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?
#194647
Author: Adam Klobukowski
Date: Tue, 22 Sep 2015 14:03
13 lines
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?
#194634
Author: Lesiok
Date: Tue, 22 Sep 2015 14:39
28 lines
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?
#194651
Author: hubert depesz lubaczewski
Date: Wed, 23 Sep 2015 08:42
34 lines
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?
#194659
Author: Marek
Date: Thu, 24 Sep 2015 09:34
10 lines
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?
#194652
Author: Marek
Date: Thu, 24 Sep 2015 10:00
46 lines
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?
#194657
Author: Marek
Date: Thu, 24 Sep 2015 10:12
16 lines
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