Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 6. 1. 2010, 21:23:24
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 |
#2 · Zasláno: 6. 1. 2010, 21:39:34
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 |
#3 · Zasláno: 6. 1. 2010, 21:57:40
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 * |
#4 · Zasláno: 6. 1. 2010, 22:15:05
Limit dej v poddotaze a na něm teprve group_concat.
|
||
Kcko Profil |
#5 · Zasláno: 6. 1. 2010, 22:18:16 · Upravil/a: Kcko
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 * |
#6 · Zasláno: 6. 1. 2010, 22:23:30
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 * |
#7 · Zasláno: 6. 1. 2010, 22:24:24
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 |
#8 · Zasláno: 6. 1. 2010, 22:47:54
Kajman:
> Jo, tak to když je to takhle, tak to nepůjde, nestačí vybrat jen data do třicáté čárky? > ht>tp://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 :) |
||
Časová prodleva: 13 let
|
0