Autor Zpráva
panterek
Profil
Zdravím,

potřeboval bych z tabulky vytáhnout data, kromě zadaných polí...např:

mám sloupce: Jméno, příjmení, bydliště atd...
A chci vytáhnout všechno (SELECT * FROM) kromě třeba bydliště...je na to nějaký select..?

díky
Kajman_
Profil *
Vyjmenujete všechny chtěné sloupce (tedy bez bydliště).
panterek
Profil
No, to by bylo opravdu fajn...ale bude jich řekněme 30 a vzhledem k tomu, že je to tabulka interaktivní (uživatel si může sloupce přidávat, odebírat) a já jejich názvy znát samozřejmě nebudu, resp budu, bude se to řadit jako: (col1, col2, col3) atd....číslo za "col" značí ID, pod kterým je název toho sloupce..takže řekněme, že mám těch sloupců "col1 - col30" a chci vybrat všechny, kromě "col20" a "col28"
panther
Profil
panterek:
uživatel si může sloupce přidávat, odebírat
uživatel si bude přidávat sloupce tabulky? Ono i to značení col1-col30 je trochu divoké, není ta tabulka špatně navržená?
panterek
Profil
No, nevím, jak to udělat, aby to bylo interaktivní ..uživatel si sám bude tvořit tabulku s počtem sloupců, některé sloupce budou viditelné jen pro něj, některé zase ne..musí se dat tyto sloupce mezi sebou zaměňovat...tzn. sloupec č.1 bude jednou na první pozici, po čase zjistí, že data pod tímto sloupcem budou lepší na pozici třetí (samozřejmě data musí sedět, jen dojde ke změně pozice), případně změna názvu celého sloupce, ale to už jsou prkotiny...musí to být komplet interaktivní

Jaké jsou tedy pro tento účel nápady? :)
panther
Profil
panterek:
sloupec č.1 bude jednou na první pozici, po čase zjistí, že data pod tímto sloupcem budou lepší na pozici třetí
na pořádí sloupců v DB přeci vůbec nezáleží.

Jaké jsou tedy pro tento účel nápady?
zatím nikdo neví, co chceš vykouzlit. Veškeré záznamy, které uživatel zadá, by se měly ukládat jako jednotlivé řádky tabulky, nikoliv sloupce.

Zkus být konkrétnější, o jakou aplikaci jde, jaká očekáváš data, ...
panterek
Profil
Nechce se mi vypisovat 20-30 položek, tak si je představme jako písmena abecedy, co písmeno, to sloupec v DB. Sloupců bude tedy 20 a uživatel tyto sloupce bude vyplňovat - čili to jsou ty řádky...

Po čase zjistí, že sloupec B už nechce, takže ho bude chtít zrušit (já ho budu jen deaktivovat, aby nebyl viděn). konečný počet sloupců ale já neznám...prostě se to bude měnit, bude chtít odebrat sloupec "b" a přidat sloupec "X"...no a to je vlastně asi všechno :)

Když bych měl sloupec s názvem např "column" a tady bych vkládal ty nově vytvořené sloupce (tedy ty písmena abecedy), tak by to bylo samozřejmě fajn...ale jak by pak vypadaly záznamy toho uživatele v DB?? Co záznam, to jeden řádek v DB...takže abych vyplnil všech 20 sloupců, tak bych musel přidat do DB 20 řádků/záznamů. což moc fajn není
jenikkozak
Profil
panterek:
Evidentně se jedná o špatně navrženou strukturu tabulek v databázi. Většinou není nutné, aby uživatel manipuloval se sloupci v tabulkách. Prosím uveďte konkrétněji, o jaká data se jedná, aby vám mohl někdo navrhnout lepší řešení.
Joker
Profil
panterek:
konečný počet sloupců ale já neznám…prostě se to bude měnit
Divná databáze.

Tohle (výběr všech sloupců kromě nějakého) udělat je problém proto, že SQL tak nějak počítá s přesně opačnou situací: Vím co chci vybrat, plus tam může být neznámý počet sloupců které nechci.
Situace, že vím co nechci vybrat a pak je neznámé množství nějakých sloupců které chci, je dost zvláštní.
panterek
Profil
Tak zkusím to ještě jednou...aut máme na světě celkem dost, takže řekněme, že chci vytvářet sloupce dle typů aut.. Admin řekněme nezná typy aut, takže je nebude vytvářet on, bude si je sám vytvářet uživatel...

Audi, Fiat, Škoda, Citroen + miliarda dalších - co značka, to sloupec, pač pod každý sloupec (značku), bude uživatel dopisovat třeba výrobní číslo.. Nevím, jak jednodušeji to vysvětlit..

To je tedy první bod...vytvoření tabulky s počtem aut/sloupců = neznámo kolik. Jaké je tedy nejjednodušší řešení na tohle..?
Joker
Profil
panterek:
Tak zkusím to ještě jednou…aut máme na světě celkem dost, takže řekněme, že chci vytvářet sloupce dle typů aut
Přesně tady je chyba.
Typy aut by rozhodně neměly být sloupce databáze Opravuji: databázové tabulky.
panterek
Profil
Umíme pochopit, že já nevííííím, jaké sloupce tam budou??? Mně je to celkem fuk :-)) Bude tam administrátorská část, kde si ten dotyčný vybere, jaký typ sloupce to bude (textový nebo číselný), zadá si, jestli má být skrytý atd.... a hotovo...ON si tam bude doplňovat co bude chtít, můj úkol je vytvořit takovou tabulku, resp kód, aby si tam mohl naplácat co chtěl a strukturu tabulky (počet sloupců, změnu pořadí, výpis zadaných sloupců) si bude udávat také on.. já to mám prostě udělat tak, aby to šlo...takže "Typy aut by rozhodně neměly být sloupce databázové tabulky. " není to pravé, co když to uživatel tak prostě mít chce?? A on to tak chtít bude...bude tam diakritika, budou tam mezery atd...ale z toho důvodu se NÁZEV sloupce nebude jmenovat "Příjmení", ale bude ho zastupovat již výše zmiňovaný např "col1", kterému bude přiřazena hodnota "Příjmení"
jenikkozak
Profil
panterek:
To je tedy první bod...vytvoření tabulky s počtem aut/sloupců = neznámo kolik. Jaké je tedy nejjednodušší řešení na tohle..?
Těch údajů jste moc neuvedl. Což takhle to udělat tak, že jedna tabulka bude obsahovat údaje o uživateli, druhá tabulka bude obsahovat značky aut a jejich id a třetí tabulka bude obsahovat id uživatele, id značky auta a ono výrobní číslo, barvu nebo co všechno tam chcete. Díky tomu v tabulce nebudou prázdná políčka, opakující se hodnoty, a především ten nesmysl s měněním sloupců.

Umíme pochopit, že já nevííííím, jaké sloupce tam budou???
Tohle by šlo napsat i líp...
panterek
Profil
jenikkozak:
„Umíme pochopit, že já nevííííím, jaké sloupce tam budou???“
Tohle by šlo napsat i líp...

To je pravda...omlouvám se, ale nevím jak slušně říct, že nejsem schopen říct, co tam přesně zákazník chce..já to prostě nevím...chci to udělat tak, aby fungovalo naprosto vše. Ten návrh tabulky jsem udělal...je udělaný tak, že je uplně jedno, jak se sloupec bude jmenovat (diakritika atd), pač v DB to bude zapsáno pomocí toho "col1 - colX"...

Nevím, jestli je ta struktura tabulky špatně nebo dobře, ale funguje...jakmile to více otestuji, určitě ji sem hodím..

Oč mi ale šlo..to měnění sloupců, já to nemyslel měnit v DB (asi to tak vyznělo)...je to prkotina, ale řekněme, že mám:

Jméno, Příjmení ....atd

A po čase zjistím, že to chci jinak...chci:

Příjmení, Jméno atd....

...čili jen vizuélní změnu tomu uživateli, aby to měl tak, jak si on bude přát...a musí to zvládnout on sám, aniž by mě o to musel žádat...prostě interaktivní...tak, aby si mohl cokoliv udělat sám, jakoby si to psal ručně.. A aby to bylo k tématu, tak samozřejmě také chci, aby si sám uživatel vybral, co se mu zobrazovat má a co ne...vždy a všude, do každé tabulky dávám dva sloupce - id a datum. No a tyto dva sloupce jsou zbytečně ukazovat uživateli...takže, řekněme, že chci zobrazit všechno, kromě: id, datum, sloupecXXX, sloupecYYY
Kajman_
Profil *
Tak když máte v konfigurace ke všem sloupcům jména a příznak, zda se má schovat, tak si uděláte seznam sloupců, které nejsou schované podle pořadí, které uživatel chce a tento seznam použijete jako select seznam,sloupcu from tabulka.

Jinak osobně bych také udělal strukturu jinak, kdy další parametr, který chce nastavovat, bude další řádek a ne sloupec.
tiso
Profil
panterek: poradie si ulož ako ďalší údaj ku názvu stĺpca, stačí zmeniť poradie vizuálne, nemusí sa aj fyzicky (zmeniť poradie stĺpcov tabuľky).
Joker
Profil
panterek:
co když to uživatel tak prostě mít chce??
Přesně proto je špatný nápad nechat sloupce tabulek navrhovat někoho, kdo neví vůbec nic o návrhu databáze.
To skončí leda tak, že uživatel po měsících používání zjistí, že tabulku na začátku navrhl úplně blbě, je to celé hrozně pomalé a nějakou funkčnost vůbec nejde realizovat.

Ještě jednou, určitě bych nenechal běžné uživatele navrhovat databázové tabulky.

Bude tam administrátorská část, kde si ten dotyčný vybere, jaký typ sloupce to bude (textový nebo číselný), zadá si, jestli má být skrytý atd.

čili jen vizuélní změnu tomu uživateli, aby to měl tak, jak si on bude přát
Takhle: Jedna věc je fyzická struktura databáze pod aplikací a druhá věc je prezentace dat uživateli.
Samozřejmě, data mohou být prezentovaná nějakou tabulkou, ve které si uživatel může volit názvy a pořadí sloupců, které sloupce uvidí, atd. To ovšem nesouvisí se strukturou databáze.
Například že uživatel něco vidí jako sloupce tabulky neznamená, že to nemůže být v databázi uložené jako řádky tabulky.
panterek
Profil
Joker:
„co když to uživatel tak prostě mít chce??“
Přesně proto je špatný nápad nechat sloupce tabulek navrhovat někoho, kdo neví vůbec nic o návrhu databáze.
To skončí leda tak, že uživatel po měsících používání zjistí, že tabulku na začátku navrhl úplně blbě, je to celé hrozně pomalé a nějakou funkčnost vůbec nejde realizovat.

Nevím, jestli se stále chápeme..ale spíš jsem to já hodně blbě vysvětlil, když to tak čtu ....ty "sloupce", já to měl na mysli sloupce z pohledu uživatele...čili co on vidí na obrazovce..a to, co on vidí, jsou jako řádky v DB...čili uživatelské sloupce (Jméno, Příjmení) jsou u mě prezentovány v DB jako "col1 a col2", bez diakritiky a spešl znaků...a takhle by to mohlo být ok, nebo ne?
Joker
Profil
panterek:
ty "sloupce", já to měl na mysli sloupce z pohledu uživatele
Fajn, ovšem pak se třeba vůbec nebudou vytahovat jako SELECT * FROM tabulka.

Nicméně tedy k původní otázce:
Pořád se zdá, že podle toho návrhu musí někde být seznam sloupců obsažených v pohledu. Tak prostě stačí do výběru vyjmenovat ty sloupce.

S tím „SELECT * kromě jednoho sloupce“ u tabulky se 30 sloupci, asi bych upřímně řečeno byl líný, udělal SELECT * a ten jeden sloupec pak prostě nepoužil.
Keeehi
Profil
Vaším hlavním problémem je, že jste špatně navrhl databázi. Dalším problémem je, že se toho návrhu nechcete vzdát. Je pravda, že celou aplikaci budete nejspíš muset kvůli tomu přeprogramovat, ale potom se s tím bude něco dát dělat. Pokud se nebudete chtít svého původního návrhu vzdát, těžko Vám někdo poradí, protože při vývojáři databáze prostě nepočítají s Vaším velmi nestandardním návrhu.

Nová databáze by mohla vypadat třeba nějak takto:
značky
id_značky | značka | zobrazit | pořadí
1         | Ford   | 1        | 1
2         | Škoda  | 0        | 3
3         | Fiat   | 1        | 5
4         | Opel   | 1        | 4
5         | Renault| 1        | 2

uživatelé
id_uživatele | jméno | příjmení | věk
1            | Petr  | Novák    | 18
2            | Jan   | Starý    | 60
3            | Karel | Černý    | 54
4            | Jára  | Dobrý    | 36

auta
id_auta | značka | uzivatel | spz
1       |3       |1         | 6A5-4652
2       |4       |1         | 4S8-6546
3       |2       |3         | 8V7-6884
4       |3       |2         | 5A7-8723
5       |3       |1         | ……
6       |1       |2         | ……
7       |5       |1         | ……
8       |1       |1         | ……

Potom můžete vytvářet takovéto dotazy:
Vypsání všech značek aut:
SELECT značka FROM značky ORDER BY pořadí;

Vypsání značek aut které mají nastaven příznak zobrazování:
SELECT značka FROM značky WHERE zobrazit=1 ORDER BY pořadí;

Vypsání všech aut a jejich majitelů:
SELECT značky.značka, uživatelé.jméno, uživatelé.příjmení, uživatelé.věk, auta.spz 
FROM auta 
LEFT JOIN značky ON auta.značka = značky.id_značky 
LEFT JOIN uživatelé ON auta.uzivatel = uživatelé.id_uzivatele;

Vypsání aut a jejich majitelů, ale jenom těch značek, které mají příznak zobrazování:
SELECT značky.značka, uživatelé.jméno, uživatelé.příjmení, uživatelé.věk, auta.spz 
FROM auta 
LEFT JOIN značky ON auta.značka = značky.id_značky 
LEFT JOIN uživatelé ON auta.uzivatel = uživatelé.id_uzivatele
WHERE značky.zobrazit=1;

A mnohé další. Při správně navržené databázi se dají pak vytvářet hodně složité dotazy.
Petr__
Profil *
Problém zřejmě je, že se vše snažíte narvat do jedné tabulky. Prakticky to vysvětlil [#20] Keeehi. Zkuste si nejdříve něco prostudovat o relacích, číselnících a normálních formách - určitě Vám to pomůže k nalezení lepšího řešení.
panterek
Profil
Hmm, tak to je velká paráda..pochopil jsem…asi až praktický příklad mi otevřel oči, jak je to vlastně jednoduché..
Moderátor Joker: Zkrátil jsem „hmm“, aby to nepřivolávalo moderátory

Omlouvám se za mnou špatně položené dotazy, Keeehl vystihl přesně, co jsem měl na mysli…resp. to tak asi mysleli všichni, jen bylo třeba mě "nakopnout" :-) Super, díky moc..

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: