Autor | Zpráva | ||
---|---|---|---|
Babemeta Profil |
#1 · Zasláno: 7. 10. 2010, 19:05:36
Mám jednoduchou statistiku hráčů, kde nechávám vypisovat několik dat z tabulky uživatelé:
$dotaz_hraci = MySQL_Query("SELECT * FROM Uzivatele ORDER BY Level DESC,Zkusenosti DESC"); while ($clen = MySQL_Fetch_Object($dotaz_hraci)){ echo "<tr>"; echo "<td>" . $clen->Jmeno . "</td>"; echo "<td>" . $clen->Level . "</td>"; echo "<td>" . $clen->Zkusenosti . "</td>"; echo "</tr>"; } A teď bych chtěl do téhle statistiky přidat ještě jeden sloupeček s datami z jiné tabulky (řazení by zůstávalo stejné). Jednak nevím jak udělat ani tohle, ale je to ještě trošku složitější, protože v této tabulce mám výpis jméno hráče a v té druhé mám jméno hráče a v dalším sloupečku data, která chci vypsat a teď mi jde to o to jestli by nějak šlo aby se do dalšího sloupečku statistiky přidal ten údaj z druhé tabulky vždycky k tomu hráči, ke kterému náleží. Díky moc |
||
panther Profil |
#2 · Zasláno: 7. 10. 2010, 19:10:33
Babemeta:
JOIN |
||
Babemeta Profil |
#3 · Zasláno: 7. 10. 2010, 19:11:58
Můžu poprosit o nějaké podrobnější vysvětlení nebo alespoň odkaz? Díky
|
||
panther Profil |
#4 · Zasláno: 7. 10. 2010, 19:17:00 · Upravil/a: panther
Babemeta:
zagooglit snad můžeš sám, ne? Mysql manuál praví toto. O spojování tabulek se píše často i tady, můžeš najít zdejší podobná témata. Klíčové slovo znáš. |
||
Babemeta Profil |
#5 · Zasláno: 7. 10. 2010, 19:38:54 · Upravil/a: Babemeta
Díky, ale asi jsem to ještě úplně nepochopil,
üdělal jsem něco takovéhleho: $dotaz_hraci = MySQL_Query("SELECT * FROM Uzivatele, Vybaveni_hrac WHERE Postava=Postava ORDER BY Level DESC,Zkusenosti DESC"); ale nefunguje mi to a navíc nevim jak udělat aby se do toho výpisu z té druhé tabulky přidal jen jedne sloupec. Mohl by mi to někdo upravit prosím? Díky moc. EDIT: a ta moje podmínka where je vlastně taky blbost :-( |
||
panther Profil |
#6 · Zasláno: 7. 10. 2010, 19:41:35
Babemeta:
„ale asi jsem to ještě úplně nepochopil,“ asi určitě ne. Kde je ten JOIN, o kterém jsem mluvil? ... FROM tabulka1 t1 JOIN tabulka2 t2 ON t1.id = t2.postava_id Nevím, jaké sloupce v tabulce máš, nemůžu radit konkrétně. Projdi diskusi a hledej JOIN, pokud ti nepomohl oficiální manuál. |
||
Babemeta Profil |
#7 · Zasláno: 7. 10. 2010, 19:53:05
Díky, ale tenhle dotaz:
$dotaz_hraci = MySQL_Query("SELECT * FROM Uzivatele t1 JOIN Vybaveni_hrac t2 ON t1.Jmeno = t2.Postava ORDER BY Level DESC,Zkusenosti DESC"); Najde jenom ty hráče, kteří mají v tabulce Vybaveni_hrac alespoň jeden zápis a naopak ty kteří tam mají více než jeden vypíše vícekrát. Já bych potřeboval aby se z té druhé tabulky vypsal jenom sloupec jméno, z řádku pro který platí že Pouziva = ano a Postava = Jmeno. A pokud nějaký hráč nemá v druhé tabulce žádný záznam aby se stejně ty data vypsala, ale jeden sloupec výpisu zůstal prostě prázdný. |
||
Alphard Profil |
#8 · Zasláno: 7. 10. 2010, 20:45:55
|
||
Babemeta Profil |
#9 · Zasláno: 7. 10. 2010, 20:51:26
Angličtině bohužel tolik nerozumim abych si to domyslel :-(
|
||
Alphard Profil |
#10 · Zasláno: 7. 10. 2010, 21:02:59
V tom případě http://www.linuxsoft.cz/article.php?id_article=837
Váš problém je zodpovězen v části Vnější problémy, ale nic se nestane, když to přečtete celé. |
||
Babemeta Profil |
#11 · Zasláno: 8. 10. 2010, 16:04:57
Přečetl jsem to, ale pořád bohužel nevím jak to udělat aby se z první tabulky vypsalo všechno a z druhé jen jeden sloupec a to pouze v případě že v jiném sloupci je hodnota ano. Navíc mi to vypisuje špatně i v této podobě:
$dotaz_hraci = MySQL_Query("SELECT * FROM Uzivatele t1 LEFT JOIN Vybaveni_hrac t2 ON t1.Jmeno = t2.Postava ORDER BY Level DESC,Zkusenosti DESC"); while ($clen = MySQL_Fetch_Object($dotaz_hraci)){ echo "<tr>"; echo "<td>" . $clen->Jmeno . "</td>"; echo "<td>" . $clen->Level . "</td>"; echo "<td>" . $clen->Zkusenosti . "</td>"; echo "</tr>"; } přičemž vše vypsáno je jen v první tabulce. Výpis u každého uživatele se provede tolikrát kolik má v druhé tabulce záznamů s jeho jménem.. |
||
tiso Profil |
#12 · Zasláno: 8. 10. 2010, 16:15:34
Babemeta: čo keby si to odpovedajúcim uľahčil a napísal tu ako vyzerajú tvoje tabuľky, vzor dát v nich (niekoľko záznamov) a popis čo chceš dosiahnuť ktorému by rozumel aj niekto iný ako ty? Vzor
|
||
Babemeta Profil |
#13 · Zasláno: 8. 10. 2010, 16:40:02 · Upravil/a: Babemeta
Není problém:
Tabulka Uzivatele: Struktura: Sloupec Typ Jmeno varchar(30) Heslo varchar(30) Penize int(8) Level int(4) Zkusenosti varchar(6) Záznam: Hrac supertajne 120 8 2 Pro tenhle výpis jsou důležité jen údaje Jmeno,Level,Zkusenosti Výpis z toho (funkční) vypadal takto: $dotaz_hraci = MySQL_Query("SELECT * FROM Uzivatele ORDER BY Level DESC,Zkusenosti DESC"); while ($clen = MySQL_Fetch_Object($dotaz_hraci)){ echo "<tr>"; echo "<td>" . $clen->Jmeno . "</td>"; echo "<td>" . $clen->Level . "</td>"; echo "<td>" . $clen->Zkusenosti . "</td>"; echo "</tr>"; } Nyní mám ještě tabulku Vybaveni_hrac Postava varchar(30) Jmeno_zbrane varchar(30) Pouziva varchar(3) Záznam: Hrac Karabiner 98k ano nebo Hrac Parabellum P-08 Luger ne Jde o to, že zde jsou zapsány všechny zbraně v hráčově vlastnictví. Hráč může najednou používat jen jednu zbraň a u té je v sloupci Pouziva uvedeno ano. Nyní chci vytvořit statistiku, kde bude Výpis: 1) Jméno hráče 2) Level (primární řazení) 3) Zkušenosti (sekundární řazení) 4) Zbraň, kterou aktuálně používá (je u ní uvedeno jeho jméno a ano) A ještě mě teď napadlo jak udělat číslování jednotlivých hráčů (další sloupec ve statistice), nějaké automatické zvětšování? Nevím |
||
Keeehi Profil |
#14 · Zasláno: 8. 10. 2010, 16:51:19
SELECT t1.Jmeno AS jmeno, t1.Level AS level, t1.Zkusenosti AS zkusenosti, t2.Jmeno_zbrane AS zbran FROM Uzivatele AS t1 JOIN Vybaveni_hrac AS t2 ON t1.Jmeno = t2.Postava WHERE t2.Pouziva='ano' ORDER BY level DESC, zkusenosti DESC; |
||
tiso Profil |
#15 · Zasláno: 8. 10. 2010, 16:52:46
Babemeta: No, chcelo by to upraviť tabuľky:
- v tabuľke Uzivatele používať primárny kľúč a v tabuľke Vybaveni_hrac sa naň odvolávať (miesto na Postava) - pravdepodobne tam máš aj tabuľku Bybaveni kde máš zbrane, takže ten istý postup by si mal aplikovať aj na túto tabuľku - Pouziva varchar(3) s hodnotami ano/ne nie je dobrý nápad, lepší je Pouziva BIT default 0 s hodotami 1/0 K veci: SELECT Jmeno, Level, Zkusenosti, Jmeno_zbrane FROM Uzivatele t1 LEFT JOIN Vybaveni_hrac t2 ON t1.Jmeno = t2.Postava WHERE Pouziva='ano' ORDER BY Level DESC,Zkusenosti DESC |
||
Babemeta Profil |
#16 · Zasláno: 8. 10. 2010, 17:13:23 · Upravil/a: Babemeta
tiso:
Díky moc funguje to :-)...ještě na to podrobně mrknu a zkusim zjistit jak přesně to funguje :-) to snad zvládnu -Primární klíč je lepší od jména jenom tím, že je to méně znaků? Ono tu hru vytvářím postupně a na některých jiných tabulkách už to mám... -Ano uhodl jsi i název :-) -Dělal jsem to jen kvůli výpisu do statistiky. Původně jsem tam měl INT 1 s 1/0 EDIT: ten dotaz je celkem jednoduchej :-D čekal jsem něco složitějšího. Díky moc. |
||
tiso Profil |
#17 · Zasláno: 8. 10. 2010, 23:47:04
Babemeta: okrem toho, že číselný primárny kľúč býva kratší, tak výhodou umelého primárneho kľúča je odstránenie závislosti vzťahov medzi tabuľkami na hodnote nejakého stĺpca (Jmeno vs. Postava, Zbran vs. Jmeno_zbrane). Takže ak potrebuješ zmeniť meno hráča, tak sa zmení na jednom mieste, nemusíš robiť zmenu vo viacerých tabuľkách a riadkoch. Tvoj pôvodný návrh síce má tiež nejaké výhody, ale nepoužil by som ho.
|
||
Časová prodleva: 14 let
|
0