Zdar,
Hledal jsem googlem, ale nic rozumneho jsem nenasel.
Daji se nejak sumovat jednotlive radky tabulky v mysql?
Mam tabulku s zaky a kazdy zak ma urcity pocet zaznamu se svymi body. Tuto tabulku bych potreboval seradit podle sumy jednotlivych zaku. S razenim neni problem, jenom nevim, jak vyrobit ten soucet u jednotlivych zaku (radku tabulky):
napr:
----------------------------------------
Login | pis1 | pis2 | pis3
-------------------------------
krajca| 0 | 6 | 5
novak| 10| 1 | 3
aust | 7 | 3 | 5
by se melo seradit takto:
aust | 7 | 3 | 5
novak| 10| 1 | 3
krajca| 0 | 6 | 5
Vim, ze neni tezke nacist tabulku a seradit ji podle radku az v php, ale da se takto serazena tabulka rozumne ziskat i nejakym mysql dotazem?
Fórum › MySQL
Sumovani radku tabulky - mysql
To Paja2 :
ok, zhruba takto:
mysql>
create table zaci (Login varchar (20), pisemka1 int, pisemka2 int);
-- tabulka s zaky, pocet sloupcu s pisemkama (pisemkaN int) neznam, jsou tvorene dynamicky
insert into zaci values ('Novak',10,12), ('krajca', 5,6), ('aust', 7, 2);
-- dejme tomu, ze mame tri zaky, kteri psali dve pisemky
select *, pisemka1+pisemka2 as body from zaci group by Login order by body asc;
-- vrati tabulku zaci serazenou podle poctu bodu jednotlivych zaku
problem je, ze neznam pocet ani jmena sloupcu s body (pisemka1, pisemka2), protoze jsou zadavany dynamicky uzivatelem.
v php bych to udelal tak, ze bych si vytahl jednoho zaka, zjistil si jmena a pocet sloupecku a vytvoril bych novou sql query, kde bych dosadil jmena sloupecku s pisemkama (za pisemka1, pisemka2, ...). To se mi ale nezda uplne idealni a radsi bych tu serazenou tabulku dostal jednim sql dotazem bez php. Ale zatim jsem nezjistil jak.
ps: nevim, jestli je priklad uplne syntakticky spravne, ale pro predstavu by to snad mohlo stacit
To je chyba navrhu. Cele to predelej, o tomhle se nema cenu vubec bavit. Howgh.
Jde o to, že počet písemek (testů nebo čehokoliv dalšího) je dán pevně počtem sloupců v tabulce. Co když tento počet budeš chtít zvětšit - to má uživatel aplikace smůlu? Špatný návrh je v tom, že se míchají jednotlivé entity do jedné tabulky.
Lépe by to vypadalo třeba takhle:
- student (id_studenta, jméno, příjmení atd.)
- test (id_testu, id_student, body atd.)
Řazení pak uděláš jednoduchým agragačním dotazem:
SELECT ts.id_studenta, sum(ts.body)
FROM test ts GROUP BY ts.id_studenta;
S testy lze samozrejmě dále pracovat a vytvořit například tabulku pro posis testu, která bude obsahovat informace o testu a kritéria vyhodnocení (prospěl-neprospěl, 1-2-3-4-5 atd.). Examinátor pak může změnit kritéria hodnocení na jednom místě a změna se projeví u všech studentů, protože v tabulce test jsou jenom body - jaké známce odpovídají by se udržovalo v popisu testu.no ono je to o neco jednodussi. Uchovavam si jenom login studenta, ke kteremu pridavam znamky. Zadne jine udaje ke studentovi nez jeho login, ktery ho identifikuje, neukladam, takze mi prijde zbytecne mit dve tabulky. Pridavat nebo ubirat sloupecky neni problem, nactu nazev pisemky a podle neho Alter table pridam nebo uberu sloupecek. Znamky pocitam dynamicky v php. Zatim je to delane jen pro moji mamu, takze je to relativne jednoduche - mama pridava pisemky se znamkami a kdyz se zak prihlasi, tak se podle jeho loginu vypise znamka, to je vse.
Dotaz, ktery si vygeneruji v php podle poctu sloupcu vypada nejak takto:
SELECT `Login`, @1 := pisemka1, @2 := pisemka2, @3 := pisemka3, (@1+@2+@3) as amount FROM `9_A` GROUP BY `Login` ORDER BY amount DESC;
JumBo: Databáze není excel a neměl bys s ní jako s excelem pracovat. Používat ALTER v aplikaci pro úpravy sloupců je prasárna. ALTER existuje kvůli případům, kdy uděláš v návrhu databáze chybu nebo když rozšiřuješ aplikaci. Ale předem počítat s použitím ALTER se ti nejednou může pěkně vymstít.
Použij ten návrh co napsal stepan, nebo ještě lépe něco takového:
základní tabulky:
- student (id_student, login, ...)
- test (id_test, nazev, datum, ...)
a spojovací tabulka:
- hodnoceni (id_hodnoceni, id_student, id_test, body)
Select na to setřídění by vypadal takto:
SELECT id_student, SUM(body) FROM hodnoceni GROUP BY id_student ORDER BY SUM(body) DESC;
Tabulku se studenty tam zřejmě někde máš, tak si ji odmysli (id_student je zřejmě ten login). Tabulku test udělej určitě. Myslím že nikdo si za nějakou dobu nebude pamatovat, co to bylo za test ta "pisemka1", co byla "pisemka2", kdy se psala "pisemka3", atd. a jestli to má tvoje mamka někde na papíře poznačený, není lepší a bezpečnější místo než v databázi u toho testu ne? Stejně to bude studenty zajímat a když jim tam vypíšeš i název testu, případně kdy se psal, hned si vzpomenou, co to bylo a proč maj tak málo bodů :-) Princip spojovací tabulky určitě zachovej. Bude se ti to hodit, až budeš aplikaci rozšiřovat nebo až budeš navrhovat něco složitějšího.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Přidání řádku do tabulky — založil Row
Editace řádku tabulky DB — založil elvis
Obarvení řádků tabulky — založil haresta
Pozadí řádku tabulky tr — založil Klor
Počítadlo řádků v MySQL — založil psenik
Moderátoři diskuze