Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů k článku
Co nefunguje v MySQL a jak to obejít

dush
dush (neregistrovaný) ---.praha.tiscali.cz
16. 12. 2009 10:53

poddotazy a modifikace stejne tabulky

„Stejné omezení platí i pro poddotazy při modifikaci záznamu – ty se také nemohou dotazovat do stejné tabulky. Takový příkaz je nutné rozdělit do dvou – nejprve získat data a v druhém kroku provést aktualizaci.“

Tohle zrovna jde, i kdyz se to musi torochu opsat

UPDATE tbl AS a
  INNER JOIN tbl AS b ON ....
  SET a.col = b.col

nebo lze upravit subquery

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

vice http://stackoverflow.com/…-from-clause nebo http://www.xaprb.com/…et-in-mysql/

Petr Bíža aura:33
16. 12. 2009 11:00

Re: poddotazy a modifikace stejne tabulky

Autor mel na mysli toto:
UPDATE tabulka
SET
sloupecek = (SELECT SUM(neco) FROM tabulka)
WHERE tabulka.id = 1

dush
dush (neregistrovaný) ---.praha.tiscali.cz
16. 12. 2009 11:16

Re: poddotazy a modifikace stejne tabulky

Ale to je stale to same, to lze napsat napr. takto

UPDATE tabulka
SET sloupecek = (SELECT SUM(neco) FROM (SELECT * FROM tabulka) AS x)
WHERE tabulka.id = 1;
Petr Bíža aura:33
16. 12. 2009 11:33

Re: poddotazy a modifikace stejne tabulky

Uz to vidim.. diky..zajimavy zpusob, asi to nebude moc rychle na velke tabulky..

Kajman
Kajman (neregistrovaný) 78.108.107.---
16. 12. 2009 23:30

Re: poddotazy a modifikace stejne tabulky

Myslím, že hodně poddotazů ve where nebo set lze přepsat do spojení.

UPDATE tabulka t, (SELECT SUM(neco) suma FROM tabulka) s
SET t.sloupecek = s.suma
WHERE t.id = 1

Ony vůbec ty spojení bývají v mysql jistější. Často se stane, že dokáže naplánovat

select * from tabulka
where sloupec in (select max(sloupec) from tabulka)

tak, že se poddotaz vykonává pro každý řádek znovu. Proto se snažím to psát do spojení, aby na to nemohla ani pomyslet.

select t.* from tabulka t
join (select max(sloupec) sloupec from tabulka) m on t.sloupec=m.sloupec
Zasílat nově přidané příspěvky e-mailem