Diskuze: herni database
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 50 zpráv z 65.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Napiš jak to celé má fungovat, a co s toho má vzniknout.
OK...udelam tabulky leagues, teams, players..atp...
a pak v db chci pripsat players pod nejaky team, takze to musim pripsat pres
nejaky kod, ze? je asi blbost dělat hráče, už v tabulce teams
Pak třeba budu mít třídu attributů kde budou čísla od 1-20..a budu chtít sečíst ty čísla a výsledek byl měl být třeba od 280-340, dál budu chtít třeba pět tříd těch attributů sečíst a výsledek by měl být mezi 1-100, ale třeba když budu chtít sečíst jen čtyři tak výsledek bude mezi 50-80 a tam potřebuju to konečný číslo vydělit 4kou a vykrátit 5ti.
A poslední je, že budete mít nějaký daný termín, který bude mít čísla součtu pěti kategorii 80,70,60,60,40 (termín 1) nebo 70,70,60,60,80 (termín 2) a při překročení těchto čísel se určí sám výsledek v podobě termínu 1-2.
Z toho popisu jsem zmatenej, jak lesní včela.
Tabulky mezi sebou provážeš buď přidáním FK (cizího klíče) s vazbou na
danou tabulku (pro vazbu 1:N), nebo vazební tabulkou (pro vazbu M:N)
Jaká čísla chceš sčítat, dělit a krátit a proč? Co má být výsledkem?
Co vlastně potřebuješ ukládat a zobrazovat?
No, každý attribut v hře máš vyjádřený číslem...sečtením dojdeš k číslu Overall je to jako máš v hře CA/PA tedy celkouvou hodnotu hrace...
v druhém případě..sečtením třeba pěti tabulek budeš mít Overall číslo k Skating, Defense atp.. když budeš mít v pěti tabulkách číslo 20 bude Overall 100, ale když budu pootřebovat jenom čtyři bude overall 80 proto potřebuju tohle číslo vydělit 4 a vynásobit 5 aby číslo bylo taky 100.
a k tomu třetímu, jsou ty termíny...a to máš to když Skating nebo
Defense + plus další budeš mít po pěti overall součtech 80,70,60,60,40
nebo 70,70,60,60,80 (kde muže mít několiset možností)...aby teda sáma ta
databáze stanovila výsledek v podobě termínu...jakože příklad
80,70,60,60,40 - kde 80 je defense. Takže překročením hodnoty 80 a
ostatních bude třeba termín Defense player..
PS: ještě k tomu svázání těch tabulek...někde nějaký návod by nebyl? určítě na to nějak příjdu, ale i tak by se hodil....
No přiznám se, že ani po tom co jsi tady popsal to sčítání a odčítání a dělení a cosi dalšího vůbec nechápu proč chceš tyhle operace dělat, kdy a za jakých podmínek, ale to máš asi nějak namyšlené.
Veřím, že jsi natolik gramotný, že dovedeš samostatně používat google aby sis nějaký ten návod co by jich byl plnej internet našel, ale protože je hezké ráno, tak ti odkaz na jeden z mnoha posílám
Podle prvního komentáře jsem usoudil že to asi má být na Windows. Jak to budeš aktualizovat na všech počítačů. Nebylo by to lepší na web?
To je rada, která mu s cizími klíči, potažmo databázemi celkově
skutečně pomůže
Asi bych ty data zpracoval v nějakym skriptu a do db bych vkládal už finální hodnoty. Tabulky a potřebný vazby mezi nima snad zvládneš vytvořit a jestli ne, tak tady je určitě nějakej návod, co se věnuje návrhu databáze
OK, tak dík ono jde spíš o to, že je to databáze pro hru a tyhle operace bude muset dělat ta hra tak i tak....jenom jsem chtěl vědět zda je to možný udělat už v db? třeba v exelu už to mam před připravený, ale mam v exelu jenom část a myslel jsem, že by to v ty db fungovalo na stejným principu. Jako naházet tam attributy a součty už udělá sama db jako to můžeš udělat v exelu abych to nemusel vypisovat znova.
u toho dělení je to např. Speed (s číslem 1) a kolonku s Agility (s číslem 1) + další dvě kolonky s číslem jedna takže výsledek by měl být : Skating (součet 1+1+1+1 = 4) a ja potřebuju 4 vydělit 4kou a násobit 5ti a výsledek bude tedy Skating = 5.
Nevím jakou zkušenost máte s herní databázi? Ale je to kvůli tomu, že se db bude postupně aktualizovat a bylo by těžké aktualizovat třeba 50 000 userů
Precetl jsem si par zpravicek, ne vsechno, prilis cteni Asi si predstavujes db nejak jinak.
Tabulky v db jsou jenom tabulky s udaji. Nic vic. Vsechny ostatni operace musi
delat tvuj program. Treba na zaklade sql prikazu.
Excel pro zmenu nema databazi. Ale mas tam tabulku i s programem.
Cili, vemes data (x-y tabulku), ulozis do db. Prectes data, zpracujes, ulozis
do db.
Je mozne pouzit sadu funkci, ktera pri cteni z db jeste data upravi.
Ano, je mozne pocitat ty vysledky, jak to popisujes. Sql prikaz by byl treba
SELECT
sloupecA,
sloupecB,
SUM(sloupecC) AS soucet,
COUNT(sloupecD) as pocet
FROM
tabulka
GROUP BY
sloupecE
Vezmi tabulku, spoj radky podle sloupecE, secti jejich sloupce C do 'soucet',
vytvor pocet spolecnych radku sloupecD do 'pocet'.
Samozrejme tam muzes udelat rovnou cely vzorecek SUM(sloupecB)/COUNT(sloupecC)
as vysledek.
A ted, co s tou tabulkou dal udelas, bys resil az dalsim sql prikazem. Tabulka
ted vypada treba
sloupecA, sloupecB, soucet, pocet
sloupecA, sloupecB, 2, 3
0, 1, 2, 3
sloupecA, 0, sloupecB, 1, soucet, 2, pocet, 3
AS = alias, je dobre ten sloupec pojmenovat, jinak dostane jen cislo v poradi
a vypadalo by to takto. U sql mas 3 moznosti formatovani tabulky. Ciselne
sloupce, jmena sloupcu a nebo spojeni obou. Nejsem si ted uplne jisty, kdyz
zvolis names, jestli ti to ocisluje, kdyz tam nemas alias, ale myslim si to
Jo, v SQL prikazu mu muzes propojovat vic tabulek. Proste je tam strasne moc moznosti. Da se napsat i procedura (funkce), ktera neco dela. Takovy program, zkratka. Cili, to, co chces, tam jde. Otazka je, zda se ti chce googlovat, jak to zapsat jako sql prikaz nebo je pro tebe jednodussi nektere veci resit pres programovaci jazyk (php), treba.
Sql je jen tabulka. Kdyz pouzijes pojem 'nastaveni', tak, u tabulky toho moc nastavovat nejde. CHARSET, ENGINE a par dalsich veci. Ty funkce, vsechno, to jsou sql prikazy, zadna nastaveni. Pr. pseudo-kod:
sql->connect('server')
sql->login('user', 'psw')
sql->selectDb('db') // nekdy vsechny 3 prikazy jsou v jednom connect
result = sql->query('SET NAMES UTF-8') // sql prikaz pro zmenu kodovani pro dalsi sql prikazy
result = sql->query('SELECT id, user_name FROM users WHERE user_name='aaa' AND user_psw='bbb') // nastav kodovani
result = sql->query('INSERT ...')
result = sql->query('UPDATE...')
result = sql->query('DELETE... ')
sql->disConnect()
Pripojis se k nejakemu sql serveru (program sql bezici na serveru).
Nalogujes. Presunes se do databaze. A pak uz jen pracujes s tabulkami. Vyber
radky z tabulky (SELECT), zmen radek/y (UPDATE), pridej radek/y (INSERT), smaz
radek/y (DELETE). Nic vic. Jsou dalsi prikazy, ale nejvic pouzivas tyhle.
A pri tom vyberu i ukladani muzes data ruzne preformatovat. Ale nejcasteji pri
vyberu. Mas tam treba v tabulce 30 sloupcu. Chces z ni jen tri + dalsi dva
zpracovane nejakym vzoreckem. Chces to spojit podle stejnych hodnot. Filtrovat
podle podminek. Vybrat jen prvnich 10 radku. Muzes tam propojit data z ruznych
tabulek (treba mas ciselnik mest: id, nazev mesta, poloha; A v hlavni tabulce
mas jen id radku z tohoto ciselniku. Ale uzivateli chces zobrazit jmeno mesta) A
sql ti pak posle tabulku, kterou uz si nejak zobrazis uzivateli. Nejlepe je
pouzivat jednoduche prikazy. Ty sql prikazy jsou jednoduche a doslovne. jenom
nekdy jsou komplikace, kdyz si vymyslis nejake specialni filtry, tak musis
vymyslet, jakymi sql funkcemi se to da vyresit (tech je asi 100, jine by sis
musel napsat jako PROCEDURE).
Pr
SELECT -- Vyber sloupce...
sloupecA,
sloupecB,
SUM(sloupecC) AS soucet,
COUNT(sloupecD) as pocet
FROM -- ... z tabulky ...
tabulka
GROUP BY -- ... a spoj podle stejnych udaju sloupcu ...
sloupecE
A kdyz to teda zrovna propojujes pres GROUP, tak obvykle chces neco spocitat. Napr jako ve tvem pripade. Mas uzivatele, ktery odehraje 5 her. Jineho, ktery jen 3. A chces jim nejspis spocitat prumerne skore
SELECT
user_name,
SUM(vysledek) / COUNT(user_name) AS vysledek
FROM
odehrane_hry
GROUP BY
user_name
Predstav si to, jakoze ti nejdriv vybere tabulku
SELECT
user_name,
vysledek
FROM
odehrane_hry
A pak ji filtruje tak, ze kdyz najde stejne jmeno, ktere uz v tabulce ma, tak
ten radek zahodi. A nez ho zahodi, muzes data predat funkcu, napr SUM, ktere
udela soucet x = x + vysledek. Nebo COUNT, ktera pocita y = y + 1.
Cili, kdyz tam budou 3 radky od jednoho hrace, tak x = 5 + 2 + 4, y = 1 + 1 + 1,
prumerne skore je tedy 11 / 3. Do SELECT pak das vzorecek, kdyz to chces mit
jako jeden sloupecek vystupu.
OK. dík moc...me vlastne slo o to aby ty soucty byli lepsi pro orientaci
primo v tý db...
ted uz chapu, ze to nejde...bud muzu ty soucty asi napsat rovnou do tabulky ze
si to spocitam sam jinak mam smulu ze?
jde o databazi pro hru...tudiz jsem potreboval tyhle udaje ktery mam v exelu mit i v db...protoze potrebuju to na test s GUI. ty funkce bude lepsi uz nastavovat pri v nakym programu, nebo to vymyslet jeste jinak..
Jde to zapsat do tabulky. Sql prikazy je mozne kombinovat. Pripadne udelat tu proceduru.
Zatim jsi nedal zadne konkretni udaje, takze se neda resit. Ale, jak jsi psal, chtel jsi ziskat zatim jen info.
google = insert into more row sql example
INSERT INTO MyTable ( Column1, Column2, Column3 )
VALUES ('John', 123, 'Lloyds Office'),
('Jane', 124, 'Lloyds Office'),
('Billy', 125, 'London Office'),
('Miranda', 126, 'Bristol Office');
google = insert into select sql
INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT table2.column1, table2.column2, 8, 'some string etc.'
FROM table2
WHERE table2.ID = 7;
google = update select sql
-- s timhle jsem se zatim nesetkal, ale mozna to take pujde
UPDATE
tgt
SET
Column1 = src.Column1,
Column2 = src.Column2,
Column3 = src.Column3,
...
FROM
dbo.TargetTable AS tgt
INNER JOIN
(
VALUES
(1, 'a', 'k', 'x', ...),
(2, 'b', 'l', 'y', ...),
(3, 'c', 'm', 'z', ...)
) AS src (ID, Column1, Column2, Column3, ...)
ON tgt.ID = src.ID
Moc dík za ochotu...posilam obrazek _ https://abload.de/…ql1kck38.png
Kde je více info
Kde ten soucet by melo byt to skating (z tech 5ti predchazejicich) kde techto souctu bude nakonec podobnych vice ale jako zaklad to staci...akorat vubec nevim jak to v tom SQL programu nastavit....
SELECT
name, lastname, Acceleration, Agility, Balance, Speed, Stamina,
SUM(Acceleration, Agility, Balance, Speed, Stamina) / COUNT(Acceleration, Agility, Balance, Speed, Stamina) AS Skating
FROM
Players
Mozna to bude treba napsat sloziteji, nezkousel jsem to. Mozna jako scitani.
No, ten dotaz bude asi slozitejsi. Nejsou jasne ale podminky, takze se da
velmi tezko radit konkretne. Zkus googlovat a kombinovat jmenovane funkce.
(Acceleration+Agility+Balance+Speed+Stamina) / (1+1+1+1+1) AS vysledek
Pripadne tam dat nejake IF NOT NULL do te druhe zavorky. To netusim, jak to
vypada v db, zda tam mas vzdy nejakou hodnotu nebo, zda tam muze byt i NULL.
NULL bude jen v pripade rozdilu attributu u brankaru a hracu....ale na tohle to nema vliv..ten AS vysledek se bude lisit vlastne kterej ten vysledek budes potrebovat...pro jaky attributy..muzes mit soucet vsechy attributu pro brankare a hrace...
vlastne kdyz bude fungovat (Acceleration+Agility+Balance+Speed+Stamina) /
(1+1+1+1+1) AS vysledek
tak to bude funkcni asi u vseho....navic ja s SQL moc zkusenosti nemam tak mi
asi nezbude nic nez nekoho zaplatit ...
'kdyby bylo'
A to je presne to, co mi do ted neni jasne. Podle ceho urcujes, ze jsou tam jen
4 vyplnene? V tom obrazku takovy pripad neni. Bud je hodnota tedy NULL nebo ''
nebo ' '.
Pokud to tak je, pak tam budes muset dat ty if. Select se desne zkomplikuje, ale
jinak to nejde. Ale, kdybys to nemel takhle v jedne tabulce, tak by to slo resit
tim grupovanim (GROUP BY).
https://abload.de/…ql1kck38.png
https://stackoverflow.com/…ot-null-only
COALESCE(lastname,'N/A')
IFNULL(lastname,'') AS lastname,
https://stackoverflow.com/…-server-2005
SELECT (ISNULL(Val1,0) + ISNULL(Val2,0) + ISNULL(Val3,0)) as 'Total'
FROM Emp
insert into emp select emp_cd, val1, val2, val3,
(val1+val2+val3) as total
from emp;
Řešení, tak jak ho popisuješ, porušuje normální formy databáze. Sloupce by měly být na sobě nezávislé. Ty máš řekněme 4 na sobě nezávislé sloupce a pak tam chceš mít další, který je na nich závislý. Hodnoty které chceš vypočítávat ze zbylých sloupců bys v tabulce vůbec mít neměl, ale měl bys je získávat buď v programu z načtených dat z DB nebo už v SELECTu z DB. Tak jak to myslíš ty, bys musel při každé změně nějakého atributu přepočítat ten závislý atribut.
ok popisu to trochu lepe.....
tady je to ok..skating muze mit hodnotu od 5-100.. https://abload.de/img/17xszu.png (obrazek1)
ale v tomhle pripade....muze mit defesive hodnotu jen od 5-80.....protoze se sklada jen ze 4 attributu, ale ja potrebuju samozrejme dosahnout vysledku, ktery presahne hodnotu 80...aby to konecne cislo bylo regulerne podobne jako u 5 attributu a proto se musi delit(4) a nasobit(5).
https://abload.de/img/3m7knp.png (obrazek 2)
kde v prvnim pripade je defensive 58 ale kdyz ji vydelite 4kou a vynasobite 5kou melo by to byt 72....v tom druhem zase je 64 ale kdyz ji vydelite 4kou a vynasobite 5kou melo by to byt 80...
doufam, ze to chapete co se snazim vysvetlit?
posledni otazka je jak vlozim v datech ten vysledek z prvniho obrazku do tech tabulek..v tomto obrazku?
https://abload.de/img/2ygsry.png (obrazek 3)
3. vlozim - Prikaz INSERT nebo UPDATE
https://www.tutorialspoint.com/…te-query.htm
Jestli to chces v jednom prikazu, tak je to trosku komplikovanejsi. Mohlo by to
vypadat nejak takhle
UPDATE t1, (SELECT ... ) t2
SET t1.skating = t2.skating
WHERE t1.skating=null and t1.player=t2.player;
Pridas si to k update jako tabulku a pak s tim pracujes dal jako s tabulkou. Ale nemam to testovane, mozna se to zapisuje malinko jinak.
2. defesive - Mas jako 2 tabulky v jedne? A nemuzes pro kazdou tabulku pouzit SELECT zvlast?
Uz jsem to zminil a pise to i P. Langer. Ono, uz od zacatku je spatne, pokud tam mas 2 tabulky v jednom, ze uvazujes excelove. Tim se ti pak vsechny sql prikazy desne komplikuji. V SQL musis mit jasnou tabulku X-Y. Nelze si natahovat delku radku, jak se ti chce. A pokud to delas, tak bys mel vedet, s kolika sloupecky pracujes, jinak bude sql prikaz komplikovany a plny IFu.
Ve tvem pripade by bylo lpsi to rozepsat na zvlast tabulky.
players: id_player, name, surname
schopnosti: id_schopnost, name
schopnosti_hraci: id_player, id_schopnost, value
cili
players
1, Alex, O.
schopnosti:
1, Agility
2, Acceleration
schopnosti_hraci
1, 1, 17
1, 2, 17
Atd, kazda schopnost zvlast a slo by to pak pekne propojit pomoci LEFT JOIN a grupovat pres GROUP BY. Mozna, ze by byly sql dotazy mene prehlednejsi, ale mohli by fungovat treba 4x rychleji. Coz by se vyplatilo pro vic nez 1000 hracu, treba. Jinak si asi na rychlost stezovat nebudes.
Ty jsi čaroděj, já až teď pochopil čeho chce caca vlastně
dosáhnout .
Nahoda Hodne pomohly
obrazky, co posila. Jako, od zacatku jsem zhruba tusil, co chce, jen jsem
nevedel, jak ma strukturovane tabulky. Tak jeho dotazy nedavaly prilis smysl.
Ted to chapu tak, ze ma tabulku neco jako toto:
jmeno, acc, agi, sta, | def, hit, shoot
Alex, 17, 17, 12, null, null, null - nebo mozna...
Alex, 17, 17, 12, 4, 5, 6
Coz je sice cool pro excel, ale v sql se s tim dost spatne pracuje.
Podle jednoho obrazku je videt, ze dela sumu pres group by player.name. Takze
tam ma vic radku se jmenem Alex? A ted nevis, co tam ma vlastne vyplnene pro ty
dalsi sloupce. Podle tech dvou obrazku to vypada, ze ma 2 ruzne tabulky, coz by
bylo ok. Ale, podle toho, co pise, to ma vsechno v jedne. tak, ja nevim, uz
A nebo zatim nema jasno, jak to navrhnout do sql a mozna to udela nakonec ve
dvou tabulkach, aspon.
Chce spocitat sumu(sloupcu) / pocet(sloupcu).
Pokud 2 tabulky dal do jedne, tak jedna ma sloupce 4, druha 5. Tak ja to vidim
na 2 rozdilne sql dotazy. A on by to chtel stale resit jednim Ne, ze by to neslo, ale bylo by to
plne tech COLEASE nebo IF. Ten sql dotaz se mi nechtelo vubec pokouset
konstruovat.
Jak popisuje, kdyby pouzil 1 univerzalni dotaz bez COLEASE, tak bude muset
vysledky prepocitavat. A navic to ani tak nejde, matematicky
No tak ted jsem se v tom trochu ztratil, ale rozhodne nemam dve
tabulky...
normalne chci mit jednu tabulku players - a v ni vsechny potrebny udaje co kazdy
hrac mam mit
at uz to jsou informacni udaje (rok narozeni, tym, pozice atp..) nebo attributy,
kterych je kolem cca 30.
akorat jsem chtel mit k tomu jeste soucty tech attributu (jako skating, defesive atp.) kvuli prehlednosti kdyz se pak nektere attributy meni podle vyvoje hrace
to opravdu musim vsechny ty udaje nejak rozdelit? a nemit je v jedne tabulce players?
Nemusis. Ale, sql neni excel. Funguje jinak.
Pokazde, kdyz menis atribut, musis znovu prepocitat ty cisla. Cili, zavolat
2x update po sobe, nejspis. Jednim prepises atributy a druhym prepocitas.
Idealne jen pro toho jednoho hrace.
A nebo to muzes delat az v tom selectu a neukladat to do tabulky.
Kdezto v excelu, tam si do policka napises primo vzorecek pro prepocet = (A1+B1+C1) / 3.
Mimochodem, ja tyhle funkce nepouzivam, jako prumer, ale mohlo by se to
jmenovat AVG, average.
https://www.techonthenet.com/sql/avg.php
caca by mohl pouzit calculated fieldy, nebo nepracovat s
tabulkou, ale View kde by ta pole pocital podle nejakych tech vzorcu, kterym
rozumi jen on
Pripadne by mu to mohli pocitat triggery ...
Mimochodem vsem dik za rady...jeste bych, ale mel dotaz..kdyz budu delat history stats u hracu, ktere bude vypadat takto :
https://abload.de/img/4hasav.png
tak zda musim delat pro kazdeho hrace zvlast novou tabulku to znamena, ze v testovaci verzi by bylo treba 600 hracu, tak bych musel mit 600 tabulek.Nebo to jde udelat jinak??
Ne, stačí ti jedna tabulka, kde se cizím klíčem budeš odkazovat na konkrétního hráče
Bude to v jedný tabulce, konkrétního hráče si budeš filtrovat v SELECTu, kde zadáš podmínku WHERE player_id = id konkrétního hráče. Ty tam ten sloupec s ID hráče nemáš, ten tam musíš přidat. Výsledný dotaz pak bude vypadat nějak takhle
SELECT *
FROM history_stats
WHERE player_id = "doplň ID požadovanýho hráče"
Takhle ti vyjedou záznamy, tak jak je máš na tom obrázku pro jednoho hráče, přičemž budeš mít jednu tabulku statistik úplně pro všechny hráče.
ID každé tabulky začíná v ideálním případě od 1. Je to unikátní klíč konkrétní tabulky a nemá žádnou souvislost s číslováním ID jiných tabulek...
Zobrazeno 50 zpráv z 65.