Autor Zpráva
Babemeta
Profil
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
Babemeta:
JOIN
Babemeta
Profil
Můžu poprosit o nějaké podrobnější vysvětlení nebo alespoň odkaz? Díky
panther
Profil
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
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
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
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
[#7] Babemeta
Vyhledejte si na odkázané stránce ([#4]) klíčové slovo "left".
Babemeta
Profil
Angličtině bohužel tolik nerozumim abych si to domyslel :-(
Alphard
Profil
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
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
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
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
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
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
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
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.

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:

0