Autor Zpráva
jefitto44
Profil
V aktuálnej databáze mám záznam, ktorý vyzerá napríklad takto
12|13|15|17
Sú to čísla užívateľov, ktoré sú priradené jednému "nadužívateľovi". Keď chcem však tomuto nadúživateľovi pridať Ďalšieho podužívateľa, potrebujem updatnúť tento uložený string bez toho, aby som ho predtým musel selectovať. Dá sa to nejako?

Dajme tomu, že k tomuto stringu potrebujem pridať ďalšieho zákazníka s ID 20. Výsledok by mal teda vyzerať 12|13|15|17|20

UPDATE table_name SET
col_name= 'col_name+|20'
WHERE blabla

Takto nejako?
Destiny_1
Profil
Hledáš asi něco takového

UPDATE table_name SET
col_name= CONCAT(col_name, '|20')
WHERE blabla
jefitto44
Profil
Výborne, presne takto to ide... Ďakujem veľmi pekne
Dan Charousek
Profil
Je to možné, ale jedná se o špatně navrženou strukturu databáze. Sprvné řešení by mělo obsahovat pomocnou tabulku, která by určovala vztahy mezi klasickým uživatelem a naduživatelem. Pokud se uživatel od naduživatele neliší příliš, mohly by být i ve stejné tabulce:

USERS
id  |  name  |  super_uzivatel
1  |  Pepa             |  ne
2  |  Venca            |  ne
3  |  Superuživatel    |  ano

A spojovací tabulka:
USERS_CONNECTIONS
id_super_uzivatele  |  id_uzivatele
3  |  1
3  |  2
Spojovací tabulka určuje, že superuživatel s ID 3 má pod sebou uživatele 1 (Pepu) a 2 (Vencu).
jefitto44
Profil
Dan Charousek:
špatně navrženou strukturu
Presne to je to, s čím mám problém. Každopádne, mať to v jednej tabuľke mi prišlo jednoduchšie, prehľadnejšie a rýchlejšie... Pomocným tabuľkám sa snažím čo najviac vyhýbať, aj keď neviem, či je to dobré
Dan Charousek
Profil
jefitto44:
mi prišlo jednoduchšie, prehľadnejšie a rýchlejšie
Jednodušší zpočátku na vytvoření. Jakmile budeš potřebovat konkrétnější dotazy, řazení, editování těch záznamů, tak tvrdě narazíš.
Rychlejší to rozhodně není.

čo najviac vyhýbať, aj keď neviem, či je to dobré
Je to špatné.

Vem si jen základní operace, které bys mohl potřebovat:
1) spočítat počet uživatelů, které naduživatel spravuje
2) vybrat všechny naduživatele, které pod sebou mají uživatele x
3) řadit podle naduživatelů/uživatelů
4) odstranit uživatele ze správy naduživatele
Keeehi
Profil
jefitto44:
Jak správně Dan Charousek napsal, to co tvoříš jde přesně na druhou stranu od správného návrhu. Zde je více čtení. Některé časteji řešené dotazy pro MySQL - FAQ
Joker
Profil
jefitto44:
Každopádne, mať to v jednej tabuľke mi prišlo jednoduchšie, prehľadnejšie a rýchlejšie
Zatímco ve skutečnosti je to složitější, nepřehledné a pomalejší.
jefitto44
Profil
Preto sa pýtam, ak by som to vedel, tak tu nespamujem, nie? ;)
lionel messi
Profil
jefitto44:
Vrelo odporúčam štruktúru db čo najskôr prepracovať. Aj v FAQ sa píše: „Čím později se návrh databáze přepracuje, tím je to bolestivější.“ Neber to ako mudrovanie, viem, o čom píšem, na úplnom začiatku svojej programátorskej cesty som taktiež nechápal, prečo je vhodné používať „tak veľa stĺpcov a dokonca aj tabuliek“. Všetci sa neustále učíme a najlepšie na vlastných chybách. Riešenie od Destinyho_1 ti na istý čas stačí, ale neskôr budeš s vysokou pravdepodobnosťou „bastliť“ ďalší, ďaleko zložitejší kód a napokon aj tak so zaťatými zubami prekopeš celú štruktúru db. Správna cesta je tá, ktorú ti ukázal Dan Charousek v [#6].
jefitto44
Profil
Napr. keď si otvoríš db WordPressu, tak je tam 6, alebo koľko tabuliek... myslel som, že WP je jeden z tých správnejších projektov...
Kajman
Profil
lionel messi:
prečo je vhodné používať ‚tak veľa stĺpcov a dokonca aj tabuliek‘

jefitto44:
Ale pozor, rozhodně neplatí, že čím více sloupců a tabulek, tím lepší návrh. Při návrhu je téměř vždy vhodné dodržovat normální formy.
jefitto44
Profil
Destiny_1:
UPDATE table_name SET
col_name= CONCAT(col_name, '|20')
WHERE blabla


Čo teraz, keď chcem odstrániť časť stringu rovnakého znenia? Keď chcem povedzme z 3|4|7|8 chcem dostať 3|7|8 ako sa to dá?
tiso
Profil
jefitto44: tak, že zmeníš návrh databázy a urobíš to poriadne, viď [#4]
lionel messi
Profil
jefitto44:
Čo teraz, keď chcem odstrániť časť stringu rovnakého znenia? Keď chcem povedzme z 3|4|7|8 chcem dostať 3|7|8 ako sa to dá?
To znamená, že chceš v každom riadku, kde sa nachádza napr. 4 toto ID odstrániť? Ak áno, malo by pomôcť toto:
UPDATE table_name REPLACE(col_name, '|4|', '')


Pozor, nebude fungovať, keď bude 4 na začiatku reťazca, v takom prípade nahraď |4 za 4| (táto alternatíva nenahradí koniec) Môžeš použiť v druhom argumente aj prosté 4 bez zvislítka, ale to zasa neodstráni prebytočný oddeľovač. Pôvodná verzia zachytávala aj |41, takže som ju upravil.

Súhlas s tisom, ale keď to rýchlo potrebuješ spraviť takto, tak budiž. Na štúdium odporúčam zohnať knižku MySQL in a Nutshell od vydavateľstva O'Reilly (autor Russel J. T. Dyer), sú v nej dobre popísané takmer všetky funkcie MySQL vrátane tých na prácu s reťazcami. Ak by si chcel poradiť, kde sa dá zohnať, napíšem ti mail.
jefitto44
Profil
Vyriešil som to tak, že aj prvá hodnota má na začiatku |, čiže to vyzerá |3|4|6|8 a selectujem z toho do poľa pomocou trim($premenna,"|")
potom $toto=str_replace("|",",",$premennaZDatabazy);
SELECT daco FROM dajaka WHERE daco IN ($toto);
tiso
Profil
jefitto44: „Vyriešil som to tak...
Fajn. A čo keď budeš mať v DB |3|4|22|25 a dáš zmazať 2?
jefitto44
Profil
To sa nestane, mazať sa bude dať iba to, čo je tam nadefinované... Aby som upresnil.

Do selectu, kde vyberáš koho zmazať, ti vyberie len také čísla, ktoré reálne zmazať môžeš. Možnosť zmazať |2 teda nebude


Ak máš čísla |2|3|4|55|56, tak ti do selectboxu vyberie iba tieto čísla a teda nemáš ako zmazať iné číslo
tiso
Profil
jefitto44: tak inak, aby to bolo jasné: |5|55|56 a dáš zmazať 5
Alphard_
Profil *
Tak tam 2 bude validně a 25 taky, nebo 22 a 225, ta situace prostě dřív nebo později nastane.
Bylo by vhodné víc studovat a míň vyvíjet metodou pokus omyl/ptát se na každý krok na diskusi. Někteří na můj vkus příliš aktivní diskutující tady vymýšlí špatná řešení a tím vás ještě podporují ve špatném návrhu.
jefitto44
Profil
ee, vy nerozumiete...

select, ktorý slúži na mazanie z databázy
<select name="name" >
<option value="|3">3</option>
<option value="|4">4</option>
<option value="|44">44</option>
</select>

Nemáš šancu vymazať niečo iné ako to, čo chceš... chápete?
juriad
Profil
A co když uživatel změní HTML přes vývojářské nástroje?
A navíc, v té ukázce smazání "|4" způsobí tu chybu také, protože smaže z řetězce část prvku "|44".

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: