Autor Zpráva
Michales
Profil
Ahoj všem.

Prosím o radu jak by měl vypadat SQL dotaz na UPDATE.
Mám sloupec Text a sloupec t_id

Ve sloupce Text jsou čísla a mohou se opakovat ve sloupci t_id jsou jen jedničky a nuly.
Nyní potřebuji následující update.
Text                t_id

6548                1
79632               1
6548                0 // zde by se měla updatem přepsat 1 protože číslo už v tabulce je a má už jedničku

Takže potřebuji udělat aby se přepsala 0 na 1 pokud v Text už shodné číslo má 1.

Díky za radu.
Kajman
Profil
Jakou používáte databázi?
Michales
Profil
Kajman:
Mysql
Kajman
Profil
Asi půjde něco takového...
UPDATE tabulka t0
       JOIN tabulka t1
         ON t0.text = t1.text
            AND t1.t_id = 1
SET    t0.t_id = 1
WHERE  t0.t_id = 0
Kubo2
Profil
Kajman:
Mohol by som ťa poprosiť o trochu názornejší popis toho dotazu? Akosi som sa v tom začal strácať...
Vďaka.
Kajman
Profil
Kubo2:
A obdobnému select dotazu k nalezení řádků, co se mají měnit, rozumíš?

SELECT *
FROM   tabulka t0
       JOIN tabulka t1
         ON t0.text = t1.text
            AND t1.t_id = 1
WHERE  t0.t_id = 0
Michales
Profil
Kajman:
Ahoj, díky za pomoc.
Tvůj dotaz by asi i mohl fungovat, ovšem nepřelouská 140 tisíc řádků.
Trvá mu to dlouho a nakonec spadne.
juriad
Profil
Michales:
Jaké indexy máš na té tabulce? Jak vypadá explain dotazu?
Michales
Profil
juriad:
Bohužel teď nic nezjistím, ikdyž zavřu prohlížeč a následně ho znovu spustím a najedu do myadminu tak se nic neděje(jen stále načítá), řekl bych že to stále šrotí ten dotaz :-(


juriad:
Kajman
Profil
Michales:
Udělej index nad sloupcem text. (Klidně i na sloupci t_id, ale s tímto sloupcem bude update možná pomalejší.) Pokud to je jednorázová akce, tak do where můžeš postupně přidávat podmínku na část tabulky...

např.
WHERE  t0.t_id = 0 AND t0.text BETWEEN 10001 and 20000
Michales
Profil
Kajman:
velice moc děkuji. Ten index výrazně pomohl.
Kubo2
Profil
[#6] Kajman:
Aha, ak som to správne pochopil, dvakrát si aliasneš tú istú tabulku, pričom alias t0 použiješ v hlavnom SELECTe a alias t1 v klauzuli JOIN? Následne sa vytvorí result-set pre t0 z riadkov, ktoré majú v stĺpci t0.t_id nulu a tento result-set sa spojí na základe stĺpca text result-setu t0 a result-setu t1 s podmienkou, že z t1 sa vyberú iba riadky, ktoré majú t1.t_id rovné 1.

Mám pocit, že tomu rozumiem správne, akurát to príliš komplikujem. Alebo som niekde urobil chybu?

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