Autor Zpráva
offest
Profil *
Dobrý den,

lámu si hlavu jak udělat v jednom dotazu nějak efektivně select a update zároveň. Je to asi tak že bych potřeboval spojit tohle

select id, knihovna, knihy, autor, vraceno from patro_1 WHERE ctenar = '$ctenar' limit 10 offest '$list';
update patro_1 set vraceno = 0 limit 10 offest '$list';

jde o to,že ten update se má provést jenom u těch položek které se vyberou tím selectem. ani nevim jestli to jde. dělám to v postgres + php.
Kubo2
Profil
offest:
Možno ti pomôže poddotaz.
offest
Profil *
a co mám dát za to update??
chtěl jsem udělat

update (
select id, knihovna, knihy, autor, vraceno from patro_1 WHERE ctenar = '$ctenar' limit 10 offest '$list')
set vraceno = 0 ;

ale to vůbec. špatná syntaxe. stejně mi to přijde nelogický protože kdyby se tohle provedlo, tak by se to provedlo jenom v tý jakoby vnitřní tabulace.nevim.tak jak?
Kubo2
Profil
offest:
update patro_1 set vraceno = 0 where id in (select id from ... limit ... offset ...)
ale niečo mi hovorí, že to asi nebude to, čo potrebuješ.
offest
Profil *
a co je to co potřebuju? :D
Kajman
Profil
offest:
Pokud potřebujete vypsat původní stav sloupce vraceno, zkuste
UPDATE    patro_1 p_new
SET       vraceno = 0
FROM      (SELECT id, vraceno
           FROM   patro_1
           WHERE  ctenar = '$ctenar'
           -- ORDER  BY id
           LIMIT  10
           OFFSET '$list'
           FOR UPDATE) p_old 
WHERE     p_new.id = p_old.id
RETURNING p_new.id, p_new.knihovna, p_new.knihy, p_new.autor, p_old.vraceno;

Pokud nepotřebujete staré vraceno, stačí do toho update od Kubo2 přidat returning část.
offest
Profil *
Děkuji a je možný že když uvnitř budu mít nějaký joiny tak by mělo bejt něco jinak?
Kubo2
Profil
offest ([#5]):
Predpokladal som, že potrebuješ updatovať riadky, ktoré vybral select a zároveň vrátiť výsledky. Na to myslím je treba použiť dva dotazy.

Aha, tak nie. Totiž až teraz som si všimol [#6] od Kajmana.
Kajman
Profil
offest:
e možný že když uvnitř budu mít nějaký joiny tak by mělo bejt něco jinak?

Ano je možné, že bude něco jinak.
Kcko
Profil
Kajman:
Kde v manualu najdu zmínku o dvou pro mě nových keyword

RETURNING
FOR UPDATE
?

Díky
Kajman
Profil
Kcko:
http://www.postgresql.org/docs/current/static/sql-update.html
http://www.postgresql.org/docs/current/static/sql-select.html
Kcko
Profil
Kajman:
Aha to není MySQL. A z čeho jste vydedukovali, že zakladatel topicu ji nepoužívá?
juriad
Profil
Kcko:
Poslení dvě slova prvního příspěvku.
Kcko
Profil
juriad:
:-)
offest
Profil *
Kajman:
a když tam tedy budu chtít mít ty joiny?? jak to mám napsat aby to fungovalo?
Kajman
Profil
Obecně odpovědět nelze. Pokud se Vám nepodaří zakomponovat join, můžete sem ještě napsat o co se pokoušíte, jaký kód jste sestavil a co vrací za chybu.

Nebo si jednoduše dělejte dva dotazy jako dříve. Jedním si vypište záznamy, zapamatujte si v php primární klíče, které pak použijete pro update.
offest
Profil *
Ale správně bych měl chtít dělat jeden dotaz ne? Prostě jenom takhle

UPDATE    patro_1 p_new
SET       vraceno = 0
FROM      (SELECT id, vraceno, uzivatel
           FROM   patro_1
           JOIN lide ON uzivatel = ctenar
           JOIN dodani ON kniha = knihy
           WHERE  ctenar = '$ctenar'
           -- ORDER  BY id
           LIMIT  10
           OFFSET '$list'
           FOR UPDATE) p_old
WHERE     p_new.id = p_old.id
RETURNING p_new.id, p_new.knihovna, p_new.knihy, p_new.autor, p_old.vraceno;



myslel jsem že ten alias p_old pak platí už pro celou tu vnitřní tabulku
Kajman
Profil
offest:
Prostě jenom takhle

A kde je problém? Dotaz v závorce sám o sobě funguje a takto nefunguje?

Ale správně bych měl chtít dělat jeden dotaz ne?

Běžnější bývá nekombinovat dotaz na úpravu a na výpis. Některé databázové platformy to ani neumožňují.
offest
Profil *
Kajman:

dotaz v závorce sám o sově funguje, ale spolu s tim updatem napíše...

column p_new.uzivatel does not exist

...když přidám něco z toho joinu do výstupu.

já myslel že z hlediska výkonu je lepší oslovovat databázi co nejmíň.
Kajman
Profil
offest:
column p_new.uzivatel does not exist

Jste si jistý že tu hlášku vrací dotaz, který jste sem poslal? p_new.uzivatel v něm nikde nepoužíváte! Navíc p_new je alias pro upravenou tabulku patro_1. Poddotaz v závorce obsahující sloupeček uzivatel, má alias p_old

já myslel že z hlediska výkonu je lepší oslovovat databázi co nejmíň.
Není pravidlem. Raději používejte syntaxi, kterou ovládáte a budete se v ní orientovat i za pár měsíců, roků - až se ke kódu vrátíte. Nebo až s ním bude muset pracovat jiný programátor. V rychlosti taky vždy neplatí, že jeden složitější dotaz je rychlejší než dva nebo tři jednoduché.
offest
Profil *
Jo jak jsem psal "...když přidám něco z toho joinu do výstupu." v tom uedném dozatu to zrovna neni. a když to rozdělim, tak stejně nemůžu s updatem použít zároveň limit a offset takže stejně by ten druhej dotaz musel dělat to co ten první. zkoušim s tim tady bojovat, ale zatim nevyhrávám.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0