Diskuze: Update sloupce když....

Ostatní jazyky SQL SQL a databáze Update sloupce když....

Avatar
michales
Člen
Avatar
michales:

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.

Odpovědět 14.6.2015 20:25
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Michal Štěpánek:

V jakém jazyce to děláš?

Nahoru Odpovědět 15.6.2015 8:55
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
michales
Člen
Avatar
Odpovídá na Michal Štěpánek
michales:

Toto bych potreboval udelat primo v databazi v myadminu. Pokud by bylo potreba i php nebranim se

Editováno 15.6.2015 9:21
Nahoru Odpovědět 15.6.2015 9:20
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Honza
Člen
Avatar
Honza:

Ahoj, pokud jsem to správně pochopil, tak by měl fungovat tenhle dotaz:

UPDATE t1
SET t1.t_id = 1
FROM myTable AS t1
INNER JOIN myTable AS t2
ON t1.Text = t2.Text AND t2.t_id = 1
WHERE t1.t_id = 0

Ta where podmínka na konci by se dala eventuálně vypustit, ale s ní mi to příjde takové čistší :)

Editováno 15.6.2015 12:04
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 15.6.2015 12:03
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
michales
Člen
Avatar
Odpovídá na Honza
michales:

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.

Nahoru Odpovědět 15.6.2015 17:36
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Honza
Člen
Avatar
Honza:

A na čem ti běží databáze? 140K řádků by mělo být naprosto bez problémů, pokud to je nějak rozumně oindexované. Nejsem si úplně jistý jestli tenhle dotaz jde ještě nějak výrazně optimalizovat.

Nahoru Odpovědět  +1 15.6.2015 18:04
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
michales
Člen
Avatar
Odpovídá na Honza
michales:

Mysql, phpmyadmin, endora, asi bude problém s těmi indexi. Řekl bych že nemám index ani na jednom.
Viz:
http://www.jpeg.cz/…15/2limU.png

Editováno 15.6.2015 18:07
Nahoru Odpovědět 15.6.2015 18:06
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
michales
Člen
Avatar
michales:

Přímo ten tvůj dotaz

UPDATE t1
SET t1.`t_id` = '1'
FROM songs AS t1
INNER JOIN songs AS t2
ON t1.`Text` = t2.`Text` AND t2.`t_id` = '1'
WHERE t1.`t_id` = 0

mi píše
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM songs AS t1
INNER JOIN songs AS t2
ON t1.Text = t2.Text AND t2.t_id' at line 3

Nahoru Odpovědět 15.6.2015 18:12
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Honza
Člen
Avatar
Odpovídá na michales
Honza:

Já jsem ten dotaz testoval na MS SQL serveru, takže je možné že na MySQL bude trošku jiná syntaxe. S tím ti ale bohužel neporadím, s MySQL nepracuju. Ale bude to podle mě jen nějaká blbost, jakože ti třeba někde chyběj uvozovky (nebo jsou někde něco navíc) apod. Dotaz jako takový by měl být ok, to je čisté SQL které by mělo fungovat víceméně všude.

Nahoru Odpovědět 15.6.2015 19:50
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Fredep
Redaktor
Avatar
Odpovídá na michales
Fredep:

Ahoj, také přesně nerozumím zadání, ale povedlo se mi udělat toto...

UPDATE tabulka SET tabulka.t_id=0;
UPDATE tabulka SET tabulka.t_id=1-(SELECT COUNT(*) FROM tabulka AS `Foo` WHERE tabulka.Text = Foo.Text AND Foo.t_id=1 );

Nastaví to jedničku, pokud stejný řádek už nemá jedničku, jen si změň název tabulky, protože jsem nevěděl, jak se ta tvoje jmenuje ;)

EDIT: Jedná se o dva dotazy odděleny středníky.

Editováno 15.6.2015 20:13
Nahoru Odpovědět 15.6.2015 20:12
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
michales
Člen
Avatar
michales:

Pridal jsem index na sloupec Text a pouzil trochu pozmenenej dotaz od Honza. Diky za pomoc.

Nahoru Odpovědět 16.6.2015 19:22
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.