Autor Zpráva
Kcko
Profil
Ahoj,

	SELECT
		CONVERT(GROUP_CONCAT( IF(tymID = domaciID, domaci_result_flag, hoste_result_flag) ORDER BY z.datum), CHAR) as zapasy
		FROM zapasy_hraci zh 
		JOIN zapasy z ON z.ID = zh.zapasID
		WHERE zh.hracID = 5
		AND z.kontumace = 0
		AND odehrano = '1'
		ORDER BY z.datum DESC
LIMIT 5



Tento jednoduchy dotaz by mel vypsat serii zapasu konkretniho hrace v tvaru VVRRPVRPRVV atd. V - vyhra, R - remiza, P - prohra.
Potreboval jsem poslednich 5 zapasu, ale vypisuje mi to vsechny zapasy ktere splnuji WHERE podminky. Uplne se ignoruje LIMIT. Nemuzu se nikde dopatrat cim by to mohlo byt, nema s tim nekdo zkusenost?
ninja
Profil
LIMIT je na počet finálních řádků výsledků, nikoliv na počet řádků zahrnutých do GROUP BY.

Jestli dobře chápu váš záměr, vůbec nepotřebujete groupovat, prostě vypište prvních 5 zápasů.
Kcko
Profil
Nelze. Potrebuju dostat do jednoho radku vice radku, tj GROUP_CONCAT. Ten dotaz je hodne slozity ( celkovy, toto je jen male odboceni, da se rici hodnota jednoho sloupce).

Lze to resit jinak?
Kajman_
Profil *
Limit dej v poddotaze a na něm teprve group_concat.
Kcko
Profil
Jasne tak jsem to mel predtim, ale ono to pak nezna jinou derivovanou tabulku ..



Jen pro ukazku, nema smysl to ani resit, je to docela slozite.



	$sql = 	
			"        INSERT INTO grt (
										id_hrac, 
										koeficient, 
										koeficient_diff,
										rok, 
										posledni_body, 
										poradi, 
										pz, 
										uspesnost,
										v, 
										r,
										p,
										gf,
										ga,
										trest,
										kontumace_win,
										kontumace_lose,
										kontumace_both,
										last_matches_count,
										streak
										)    
		
					  SELECT 
					  hrac, 
					  SUM(KOEFICIENT) + 1000 AS KOEFICIENT,	
					  SUM(KOEFICIENT) + 1000 - (SELECT IFNULL(SUM(trest), 0) FROM tresty WHERE rok = $year AND hracID IN (tmp.hrac) ) AS KOEFICIENT_DIFF,
					  $year,
						(SELECT
						IF(t1.domaciID = t2.tymID, koeficient1, koeficient2) as koeficient
						FROM zapasy t1 JOIN 
						zapasy_hraci t2 ON t2.zapasID = t1.ID
						WHERE t1.odehrano = 1
						AND t2.hracID = tmp.hrac
						AND t1.datum BETWEEN '$year-01-01' AND '$year-12-31 23:59:59'
						ORDER BY datum DESC LIMIT 1),
					  0,
					  SUM(PZ) AS PZ,
					  ROUND(  (SUM(WIN) * 3 +  SUM(DRAW) * 1) /  ((SUM(WIN) + SUM(DRAW) + SUM(LOSE)) * 3)  * 100),
					  SUM(WIN) AS WIN, 
		              SUM(DRAW) AS DRAW, 
		              SUM(LOSE)  AS LOSE,			  
		              SUM(g1)   AS G1,
		              SUM(g2)   AS G2,
					  (SELECT IFNULL(SUM(trest), 0) FROM tresty WHERE rok = $year AND hracID IN (tmp.hrac))	AS TREST,
					  SUM(KONTUMACE_1) as KONTUMACE_WIN,
					  SUM(KONTUMACE_2) as KONTUMACE_LOSE,
					  SUM(KONTUMACE_3) as KONTUMACE_BOTH,
					  0,
					  
					  
		
					  /*(SELECT
								COUNT(t2.zapasID) as pocet
								FROM 
								zapasy t1 JOIN 
								zapasy_hraci t2 ON t2.zapasID = t1.ID
								WHERE t2.hracID = tmp.hrac
								AND t1.odehrano = 1
								AND kontumace = 0 
								AND DATE_SUB(NOW(), INTERVAL 30 DAY) < t1.datum)
						*/
						
					 /* STREAK */
					 
					(
							SELECT
							CONVERT(GROUP_CONCAT( IF(tymID = domaciID, domaci_result_flag, hoste_result_flag) ORDER BY z.datum DESC), CHAR) as zapasy
							FROM zapasy_hraci zh 
							JOIN zapasy z ON z.ID = zh.zapasID
							WHERE zh.hracID = tmp.hrac
							AND z.kontumace = 0
							AND odehrano = '1'
							ORDER BY z.datum DESC
							LIMIT 30
							
					) 				
					  
		      FROM
		      
		      (  
		              /* hrac id*/
		              SELECT hracID as hrac,
		              1 as PZ,
		              koeficient1 as KOEFICIENT,
					  
					  /* normalni goly */
					  IF(golyDomaciET > 0, golyDomaciET,  golyDomaci90) as g1, 
					  IF(golyHosteET > 0, golyHosteET,  golyHoste90) as g2,
		             
					  /* vyhra */
					  CASE WHEN domaci_result_flag = 'V'
		              THEN 1 
		              ELSE 0 
		              END AS WIN, 
		             
					  /* remiza */
		               CASE WHEN domaci_result_flag = 'R'
		              THEN 1 
		              ELSE 0 
		              END AS DRAW, 
		              
					  /* prohra */
					   CASE WHEN domaci_result_flag = 'P'
		              THEN 1 
		              ELSE 0 
		              END AS LOSE, 
		              
		              /* vitezna kontumace */
					  CASE WHEN domaci_result_flag = 'KV'
		              THEN 1 
		              ELSE 0 
		              END AS KONTUMACE_1, 
		              
		
		              /* prohra kontumace */
					  CASE WHEN domaci_result_flag = 'KP'
		              THEN 1 
		              ELSE 0 
		              END AS KONTUMACE_2, 
		
		              
					  /* prohra kontumace , oba*/
					  CASE WHEN domaci_result_flag = 'KK'
		              THEN 1 
		              ELSE 0 
		              END AS KONTUMACE_3
		             
		             
		             
					FROM zapasy  t1
					JOIN zapasy_hraci t2 ON t2.zapasID = t1.ID
					WHERE t1.odehrano = 1  
					AND t2.hracID IN ($user)
					AND t1.domaciID = t2.tymID
					AND YEAR(t1.datum) = $year
				
		       
		            
		            UNION ALL
		            
		              /* hrac id*/
		              SELECT hracID as hrac,
		              1 as PZ,
		              koeficient2 as KOEFICIENT,
					  
					  /* normalni goly */
					  
					  IF(golyHosteET > 0, golyHosteET,  golyHoste90) as g1, 
					  IF(golyDomaciET > 0, golyDomaciET,  golyDomaci90) as g2,
		             
					  /* vyhra */
					  CASE WHEN hoste_result_flag = 'V'
		              THEN 1 
		              ELSE 0 
		              END AS WIN, 
		             
					  /* remiza */
		              CASE WHEN hoste_result_flag = 'R'
		              THEN 1 
		              ELSE 0 
		              END AS DRAW, 
		              
					  /* prohra */
					   CASE WHEN hoste_result_flag = 'P'
		              THEN 1 
		              ELSE 0 
		              END AS LOSE, 
		              
		              /* vitezna kontumace */
					  CASE WHEN hoste_result_flag = 'KV'
		              THEN 1 
		              ELSE 0 
		              END AS KONTUMACE_1, 
		              
		
		              /* prohra kontumace */
					  CASE WHEN hoste_result_flag = 'KP'
		              THEN 1 
		              ELSE 0 
		              END AS KONTUMACE_2, 
		
		              
					  /* prohra kontumace , oba*/
					  CASE WHEN hoste_result_flag = 'KK'
		              THEN 1 
		              ELSE 0 
		              END AS KONTUMACE_3
		             
		             
		             
					FROM zapasy  t1
					JOIN zapasy_hraci t2 ON t2.zapasID = t1.ID
					WHERE t1.odehrano = 1  
					AND t2.hracID IN ($user)
					AND t1.hosteID = t2.tymID
					AND YEAR(t1.datum) = $year
		        ) 
		         as tmp
		         JOIN hraci ON tmp.hrac = hraci.id 
		         GROUP BY hrac
		         
		   
		         
		";




Zvyraznenou cast jsem mel nejak takto


		 /* STREAK */
					 
					(
							SELECT 
							CONVERT(GROUP_CONCAT( IF(tymID = domaciID, domaci_result_flag, hoste_result_flag) ORDER BY z.datum DESC), CHAR) as zapasy
							FROM(
							
							SELECT
							*
							FROM 
							JOIN zapasy z ON z.ID = zh.zapasID
							WHERE zh.hracID = tmp.hrac
							AND z.kontumace = 0
							AND odehrano = '1'
							ORDER BY z.datum DESC
							LIMIT 5
							) as tempXXX


Ale tady mi to rvalo ze to nezna sloupec tmp.hrac , uz je to moc zanorene asi.

Kazdopadne diky za ochotu.
Kajman_
Profil *
Jo, tak to když je to takhle, tak to nepůjde, nestačí vybrat jen data do třicáté čárky?
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index
Kajman_
Profil *
Nebo si naprogramovat funkci, které se předají ty parametry a tam už to asi může být poddotazem s tím limitem.
Kcko
Profil
Kajman:
Jo, tak to když je to takhle, tak to nepůjde, nestačí vybrat jen data do třicáté čárky?
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index
Jasne, tuhle funkci znam, nenapadla me. Urcite se to da pouzit, jen jsem to chtel omezit tim limitem, takhle stejne budu vybirat vsecko a az z toho vysledku "ukrojim", ale je to urcite lepsi nez jak to mam nyni.

Nebo si naprogramovat funkci, které se předají ty parametry a tam už to asi může být poddotazem s tím limitem.
Aha, takze bych predal limit a pak pravdepodobne tmp.hrac ? To je elegantni no :-)

Muzes mi vysvetlit nebo odkaz nekam proc tu hodnotu z tmp.hrac uz v dalsim zanorenem selectu nevidi? Diky, rad bych to chapal :)

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: