Autor Zpráva
Kcko
Profil
Ahoj,

rad znal IDcka vzajemnych zapasu mezi 2 hraci.

tabulka
------------

CREATE TABLE IF NOT EXISTS `zapasy_hraci` (
  `zapasID` mediumint(9) NOT NULL,
  `hracID` mediumint(9) NOT NULL,
  `tymID` mediumint(9) NOT NULL,
  `grt_pos_before_match` smallint(6) NOT NULL,
  `grt_pos_after_match` smallint(6) NOT NULL,
  UNIQUE KEY `zapasID` (`zapasID`,`hracID`,`tymID`),
  KEY `hracID` (`hracID`),
  KEY `zapasID_2` (`zapasID`),
  KEY `tymID` (`tymID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



Dotaz
SELECT 
t1.hracID,
t1.zapasID,
t2.hracID,
t2.zapasID
FROM zapasy_hraci t1 JOIN zapasy_hraci t2
ON t2.zapasID = t1.zapasID 
WHERE 
t1.hracID = 1116 AND t2.hracID = 1


Vysledek dotazu
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	t1 	ref 	zapasID,hracID,zapasID_2 	hracID 	3 	const 	19 	Using index
1 	SIMPLE 	t2 	ref 	zapasID,hracID,zapasID_2 	zapasID 	6 	1012_pes2.t1.zapasID,const 	1 	Using index


Vypada to rychle nicmene, zda-se mi divne to ze to prochazi 19 radku, to je totiz celkovy pocet zapasu jak hrace 1 tak hrace 1116.
Takze se mi zda, ze to prochazi proste vsechno i kdyz se indexy pouziji. Melo to by projit skutecny pocet vzajemnych Idcek (tj 3 = v me DB )

Nevi nekde proc tomu tak je, ci jak dotaz lepe sestrojit?
Kajman_
Profil *
Jaký bude explain u

FROM zapasy_hraci t1 JOIN zapasy_hraci t2
ON t2.zapasID = t1.zapasID AND t2.hracID = 1
WHERE 
t1.hracID = 1116


Jinak si myslím, že klíč zapasID_2 nepřináší nic navíc než klíč zapasID. Pro tento konkrétní dotaz by pak mohlo být rychlejší mít v klíči hracID i sloupeček zapasID, ale jisté to není.
Kcko
Profil
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	t1 	ref 	zapasID,hracID,zapasID_2,slozeny 	hracID 	3 	const 	19 	 
1 	SIMPLE 	t2 	ref 	zapasID,hracID,zapasID_2,slozeny 	zapasID 	6 	1012_pes2.t1.zapasID,const 	1 	 


Vychazi to cca na stejno. Pred refactoringem aplikace jsem to mel v jedne tabulce ( ale tam byl vzdy 1 domaci a 1 host ) a ted to muze byt prave 1:n, takze to musim resit takto JOINem, ocividne to zrychlit uz nepujde.

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: