Autor | Zpráva | ||
---|---|---|---|
offest Profil * |
#1 · Zasláno: 5. 1. 2014, 22:17:35
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 |
#2 · Zasláno: 5. 1. 2014, 22:26:37
offest:
Možno ti pomôže poddotaz. |
||
offest Profil * |
#3 · Zasláno: 6. 1. 2014, 00:37:08
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 |
#4 · Zasláno: 6. 1. 2014, 01:00:29
offest:
update patro_1 set vraceno = 0 where id in (select id from ... limit ... offset ...) |
||
offest Profil * |
#5 · Zasláno: 6. 1. 2014, 01:25:54
a co je to co potřebuju? :D
|
||
Kajman Profil |
#6 · Zasláno: 6. 1. 2014, 08:27:27
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 * |
#7 · Zasláno: 6. 1. 2014, 10:50:15
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 |
|||
Kajman Profil |
#9 · Zasláno: 6. 1. 2014, 12:26:49
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 |
#10 · Zasláno: 6. 1. 2014, 16:22:44
Kajman:
Kde v manualu najdu zmínku o dvou pro mě nových keyword RETURNING FOR UPDATE Díky |
||
Kajman Profil |
#11 · Zasláno: 6. 1. 2014, 16:48:35
|
||
Kcko Profil |
#12 · Zasláno: 6. 1. 2014, 17:39:49
Kajman:
Aha to není MySQL. A z čeho jste vydedukovali, že zakladatel topicu ji nepoužívá? |
||
juriad Profil |
#13 · Zasláno: 6. 1. 2014, 18:05:55
Kcko:
Poslení dvě slova prvního příspěvku. |
||
Kcko Profil |
#14 · Zasláno: 6. 1. 2014, 18:24:28
juriad:
:-) |
||
offest Profil * |
#15 · Zasláno: 6. 1. 2014, 18:34:12
Kajman:
a když tam tedy budu chtít mít ty joiny?? jak to mám napsat aby to fungovalo? |
||
Kajman Profil |
#16 · Zasláno: 7. 1. 2014, 09:44:17
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 * |
#17 · Zasláno: 7. 1. 2014, 10:07:15 · Upravil/a: offest
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 |
#18 · Zasláno: 7. 1. 2014, 12:40:34
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 * |
#19 · Zasláno: 7. 1. 2014, 13:14:33
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 |
#20 · Zasláno: 7. 1. 2014, 13:34:00
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 * |
#21 · Zasláno: 7. 1. 2014, 18:52:43
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.
|
||
Časová prodleva: 10 let
|
0