Autor Zpráva
H13
Profil
Ahoj, měl by někdo nápad nebo alespoň myšlenku, jak vyřešit následující pouze na úrovni MySQL.


Tabulka:

id | id_rodice | id_rodice_byvala_hodnota |
===========================================
1  | 11        | 0                        |
2  | 12        | 0                        |
3  | 13        | 0                        |
4  | 0         | 11                       |
5  | 0         | 12                       |
6  | 0         | 13                       |

U řádků, které mají hodnotu id_rodice větší než nulu, je potřeba tuto hodnotu změnit na nové id_rodice a klíč je id_rodice_byvala_hodnota.

Tedy např. řádek číslo 1 má dostat hodnotu 4 (protože id_rodice(1) = 11 a id_rodice(4) a jeho id_rodice_byvala_hodnota = 11

Výsledek by měl být:

id | id_rodice | id_rodice_byvala_hodnota |
===========================================
1  | 4         | 0                        |
2  | 5         | 0                        |
3  | 6         | 0                        |
4  | 0         | 11                       |
5  | 0         | 12                       |
6  | 0         | 13                       |

Zkouším různé podmínky a pořád se nemůžu dopátrat výsledku, něco jako:

UPDATE tabulka SET
CASE WHEN id_rodice > 0 
AND id_rodice_bavala_hodnota = 0 //to proto, aby se nově přepsané hodnoty nezačaly cyklovaně přepisovat
THEN id_rodice = (SELECT id FROM tabulka WHERE ... // a tady sem v koncích, něco jako:
id_rodice_byvala_hodnota = id_rodice) END; //???

Pokud někdo rozumí, co potřebuji udělat a měl by nějaký nápad, byl bych za něj rád.

Děkuji
Tori
Profil
Zkuste:
UPDATE tabulka t
INNER JOIN tabulka ref ON t.id_rodice = ref.id_rodice_byvala_hodnota
SET t.id_rodice = ref.id
WHERE t.id_rodice > 0

Manuál praví: „Currently, you cannot update a table and select from the same table in a subquery.“, což jsem si vyložila jako "ale spojení tabulek provést můžete", snad správně.
Kcko
Profil
Tori:
Zkusil sem si to a na mě to nehulákalo MySQL 5.1.3.6
H13
Profil
Ahoj,

Tori:
Děkuji moc, funguje to přesně, jak jsem potřeboval

Kcko:
Díky za test

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: