Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
Ahoj, mensi problemek ...
opet z fotbaloveho sveta ... Mam vypis tymu, sesortovany podle urcitych parametru ( body, vstrelene goly, obdrzene goly atd.) Kdyz maji 2 tymy stejny pocet vsech parametru, tak logicky jsou na stejne pozici, toto zatim resim aplikacne. Neco ve smyslu $i=0; $minulypocet=0; while($r=mfa($sql)) { $i++; if ($minulypocet==$r[TOTAL]) $pozice= " "; else $pozice= "$i."; $minulypocet = $r[TOTAL]; } Jenze nyni bych si to rad ulozil ke kazdemu tymu do DB onu pozici. 1/ muzu to aplikacne zapsat viz ukazka, nicmene tabulka muze mit treba 500 tymu tj => 500x update na DB se mi moc nelibi 2/ muzu zkusit proceduru ktera bude rychlejsi, ale porad to neni to co bych si predstavoval 3/ precislovat to pomoci databazovych promennych "@", akorat to nemuzu vymyslet :-) Takze bych prosil o radu nebo o nakopnuti smerem k bodu cislo 3/ |
||
Kcko Profil |
#2 · Zasláno: 19. 7. 2009, 23:16:40
No jo tak si odpovim sam , napsal sem si proceduru, ale kdyby znal nekdo snazsi zpusob ...
CREATE PROCEDURE SP_poradi() BEGIN DECLARE s_poradi INT(5); DECLARE s_body INT(5); DECLARE temp_body INT(5) DEFAULT 0; DECLARE s_tym VARCHAR(50); DECLARE my_rank INT(5) DEFAULT 0; DECLARE done TINYINT(1) DEFAULT 0; DECLARE i INT; DECLARE rank CURSOR FOR SELECT tym, body, poradi FROM poradi ORDER BY body DESC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET i = 0; OPEN rank; rank_loop: LOOP FETCH rank INTO s_tym, s_body, s_poradi; IF done THEN LEAVE rank_loop; END IF; IF (temp_body <> s_body) THEN UPDATE poradi SET poradi = i + 1 WHERE tym = s_tym; ELSE UPDATE poradi SET poradi = i + 0 WHERE tym = s_tym; END IF; SET i=i+1; SET temp_body = s_body; END LOOP rank_loop; CLOSE rank; END; |
||
Kcko Profil |
#3 · Zasláno: 19. 7. 2009, 23:25:17
PS. Otazkou je , jak moc to bude rychle? Nemate s tim nekdo zkusenosti, kolega mi prave rekl abych se na SP vykaslal, ze jeho SP ktera preukladala jednoducha data v podobe asi 40tis. radku do jine tabulky trvala pul hodiny a ze sou SP jeste nevychatane stale.
Diky |
||
TomášK Profil |
#4 · Zasláno: 20. 7. 2009, 00:59:38
Podobným problém s očíslováním jsem řešil a přišel jsem na následující řešení (seřazené podle toho, jak je považuju za vhodné):
1, přejít od MySQL k databázi, která podporuje analytické funkce, třeba PostresSQL 8.4. Pro srovnání dotaz ekvivaletní tvé proceduře by vypadal asi takto: SELECT rank() OVER w, tym.id FROM tabulka WINDOW w AS (ORDER BY body DESC); 2, Stored procedura. 3,pomocí @, většinou to funguje, už jsem se na tom i spálil - při složitějším dotazu mi to fungovat přestalo, i jsem tam našel jeden tuším GROUP BY, který rozhodoval o tom, jestli se to očísluje správně nebo ne. Proto tohle řešení nemám moc rád a radši si dám práci s tou procedurou. Idea vypadá takto: SET @poradi := 1; SET @body := -1; SELECT @poradi := @poradi + (@body = body) AS poradi, @body := body tym.id, ... FROM tabulka ORDER BY body DESC 4, korelovaný poddotaz - narozdíl od SP má kvadratickou složitost oproti lineární, bude to pomalé. Hodně pomalé. SELECT (SELECT COUNT(*) FROM tabulka AS t WHERE t.body < tabulka.body) AS poradi, tym.id FROM tabulka Co se týče výkonnosti SP - 500 záznamů je z hlediska databáze nezajímavé číslo - tím můžeš vyvádět ledaccos (v rámci SP, 500 dotazů přes php by mohlo být o něco horší) a stejně to bude v sekundách. Mám podobnou databázi pro deskovou hru. Stovky hráčů, stovky turnajů, desítky tisíc partiií. Z toho počítám pořadí - jsou tam i výpočetně náročnější kritéria jako počet vítězství soupeře, z těch pořadí dál počítam kvalifikaci, která závisí na umístění na turnaji (obojí čísluju). Předpočítání pořadí a kvalifikace pro každý turnaj vytvoří celkem přes 100 000 záznamů a trvá cca půl minuty až minutu. Výpočet je pomocí SP. |
||
Kcko_zzz Profil * |
#5 · Zasláno: 20. 7. 2009, 01:11:26
TomášK
Diky Tome za vycerpavajici odpoved. 1/ Nejak jsem teto DB neprisel na chut, mam rad MYSQL a PMA a nechci se momentalne ucit nic jineho, kdyz MYSQL neovladam jeste tak jak bych si predstavoval 2/ Ano ano, napsal jsem si 3/ Zitra si to jeste vyzkousim dle tve idey, ja prave toto ocislovani pomoci uz. promennych pouzivam, nicmene se to hodi opravdu na jednodussi pripady, a tenhle to zrovna nebyl 4/ Koukam, tohle me ani nenapadlo, ale rychle to asi moc nebude, ale zkusim si to taky :-) Nakonec se ta SP jevi jako nejvhodnejsi ale pro klid na dusi variantu 2 a 4 zitra urcite vyzkousim Kolega mel tu SP asi spatne napsanou, kdyz se mu generovala tak jak se mu generovala. PS. mohl bych se na tebe s variantou 2 jeste obratit kdyz se mi nepodari tak jak si predstavuji? Dobrou noc a diky |
||
TomášK Profil |
#6 · Zasláno: 20. 7. 2009, 02:02:02
Tohle je téma, které se tu v nějaké obměně čas od času objevuje, takže moje odpověď se s přibývajícími informacemi snad postupně zdokonaluje :)
Předpokládám, že mluvíš o 2 a myslíš 3. Ten dotaz nemusí být dobře, psal jsem ho z hlavy, ale rád ho upravím, pokud nebude fungovat. Už teď vidím jednu nedokonalost - pořadí bude vracet ve tvaru 1,1,2,3 místo zde zřejmě vhodnější 1,1,3,4. K té 4 - zkoušel jsem to na tabulce o 100 000 záznamech a očíslovat prvních 10 trvalo cca 3s, prvních 100 trvalo 15 vteřin. Očíslování celé tabulky by bylo hotové předpokládám někdy nad ránem... |
||
Kcko Profil |
#7 · Zasláno: 20. 7. 2009, 12:34:56
CREATE PROCEDURE SP_Fill()
BEGIN DECLARE i INT DEFAULT 0; my_loop: LOOP SET i = i + 1; IF (i > 1000) THEN LEAVE my_loop; END IF; INSERT INTO poradi VALUES(CONCAT('tym - ', i), i, 0); END LOOP my_loop; END; Takze moje pokusy tabulka o 1000 zaznamech. varianta 4/ SELECT (SELECT COUNT(*) + 1 FROM poradi as t1 WHERE t1.body > t2.body) AS rank, t2.tym, t2.body FROM poradi as t2 cas 0,02s ( nutno brat v potaz ze je to jen jedna podminka ve skutecnosti jich bude vic, takze i cas muze narust, ale nic drastickeho to asi nebude ) varianta 2/ ( SP ) Ocislovani 1000 radku trva cca 1,1 - 1,4s - coz neni extra, ale v aplikaci to poznat stejne nepujde, bude se to provadet jen pri ulozeni zapasu a uzivatel to ani nepostrehne varianta 3/ ( pomoci uz. promennych "@") To jsem nejak nerozchodil tu tvoji ideu :) bud mi to haze stejne poradi (porad 1 ) nebo NULL varianta 1/ ocislovat to klasicky prasacky v cyklu pomoci mysql_query ( a taky bych rekl ze to nebude nic hrozneho = pomaleho ) Celkove vzato - elegantni je SP, ale neni extra rychla - dotaz z varianty 4 neni pomaly, ale ja potrebuji mit pozice ulozene natvrdo ( nicmene nekdy se to na neco hodit bude, proto si to ukladam do sveho MYSQL Hot-tips archivu :)) - variantu 3 jsem tedy nerozchodil, a asi na to kasleme , protoze je to uz na ukor citelnosti a pochopitelnosti (alespon pro mne ) - a varianta 1 - to je reznicina no ... ale nemyslim si ze by to bylo tak pomale, jeste si to musim vyzkouset. |
||
TomášK Profil |
Mohl by to tu někdo prosím pročistit? Došlo k chybě, viz http://diskuse.jakpsatweb.cz/?action=vthread&forum=18&topic=97631 a Kcko zkoušel odesílat příspěvek víckrát.
Moderátor Chamurappi: Staniž se.
Zdály se mi ty výsledky podezřelé, a páč mě to zajímalo, zkusil jsem to. Testoval jsem 5000 řádků, aby ty rozdíly byly větší: 1/ ocislovat to klasicky prasacky v cyklu pomoci mysql_query podle mě to bude stejně náročné, jako stored procedura + náklady na režii na komunikaci 2a, Stored procedura - 2min, 42sec Tvá stored procedura mi ne neočíslovala správně, když mělo víc týmů stejně bodů, ale nechce se mi tam hledat chyba. Myslím, že tam je něco z hlediska náročnosti na výpočet nedůležité, ale na první pohled to nevidím. Mohlo to vzniknout i někde při přenosu... 2b, Stored procedura s indexem na sloupci tym - 1.64sec Ten index stojí za to :) Jinak se tam při každém UPDATU prohledává celá tabulka. 3/ ( pomoci uz. promennych "@") - 0.04sec SET @minule := 0; SET @poradi := 0; SET @radek := 1; SELECT tym, body, @poradi := IF(@minule = body, @poradi, @radek) AS poradi, @radek := @radek + 1 AS radek, @minule := body AS tmp FROM poradi ORDER BY body DESC; 4a, poddotaz - 3 min 23sec 4a, poddotaz s indexem nad body - 1 min 27sec Shrnutí: - bezkonkurenčně nejrychlejší jsou uživatelské proměnné - jen hrozí, že se třeba změní verze MySQL a začne se dotaz chovat jinak. Asi ne, ale zaručené to nemám... - stored procedura je elegantní a rychlá, jen potřebuje index - poddotaz je pro trochu větší množinu už nepoužitelný. Index mu pomůže, ale pořád je nepoužitelný - uložení natvrdo by určitě taky šlo vymyslet přes nějaký update. Přinejhorším procedura, která vytvoří dočasnou tabulku, nahraje do ní výsledky selectu a pak podle té tabulky zaktualizuje původní. Ale zdá se mi, že by to mohlo jít i celé jedním dotazem. |
||
Kcko Profil |
#9 · Zasláno: 20. 7. 2009, 17:59:14
Omlouvam se za opakovane prispevky, trefil sem se zrovna do doby kdy se forum zblaznilo a ja myslel ze pouze muj FF.
Jinak sem si tedy udelal taky zatezovy test ( opet na onech 1000 radcich ) 1/ Je to bohuzel rychlejsi nez SP , cas je vzdy mezi 0,2 / 0,3s ( spise k nizsi hodnote ) 2/ Tak samozrejme index bych nasadil ale SP je pomalejsi cas pri prvnim spusteni 0,8s, pri druhem 0,5s a pri dalsich rychle za sebou volanych prikazu se pohybuje kolem 0,2s stejne jako v prvni variante 3/ Hezky zpusob, musim si ho precist tak 5x jeste abych ho pochopil, jak by do nej sel zakomponovat rovnou update aby dosadil ony vypocitane pozice 4/ me vychazi pod 0,05s - zvlastni PS. Jinak v te moji SP byla skutecne chyba, diky za upozorneni, opraveno => CREATE PROCEDURE `SP_poradi`() BEGIN DECLARE s_poradi INT(5); DECLARE s_body INT(5); DECLARE temp_body INT(5) DEFAULT 0; DECLARE s_tym VARCHAR(50); DECLARE my_rank INT(5) DEFAULT 0; DECLARE done TINYINT(1) DEFAULT 0; DECLARE position TINYINT DEFAULT 0; DECLARE i INT; DECLARE rank CURSOR FOR SELECT tym, body, poradi FROM poradi ORDER BY body DESC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET i = 0; OPEN rank; rank_loop: LOOP FETCH rank INTO s_tym, s_body, s_poradi; IF done THEN LEAVE rank_loop; END IF; SET i=i+1; IF (temp_body <> s_body) THEN SET position = i; ELSE SET position = position; END IF; UPDATE poradi SET poradi = position WHERE tym = s_tym; SET temp_body = s_body; END LOOP rank_loop; CLOSE rank; END Jinak pises ze nevis co by to tam mohlo byt z hlediska vypoctu slozite, no ono tam nic sloziteho neni ale proste musi zmenit 1000 radku a prochazi je po jednom, tak to proste neni hned :-) ( nejspis , o SP toho moc nevim ) |
||
Kcko Profil |
#10 · Zasláno: 20. 7. 2009, 18:20:04 · Upravil/a: Kcko
Tak jeste mensi info
Procedura je rychlejsi nez prasecina mysql_query v cyklu pri vetsim poctu radku, zkousim to ted na 10tis. zaznamech a rozdil je tam cca 20% 7,5s x 10/11s ( update nebo insert 10tis. zaznamu ) Pricemz tvuj korelovany dotaz si s tim hrave poradi za 0,1 - 0,2s :) (samozrejme, ze on jen taha data napric tomu ze SP ci proceduralni skript INSERTUJE / UPDATUJE hafo zaznamu) , ale stejne se mi to lisi oproti tobe ve vypoctech a to o hodne .. PS. ICQ? SELECT (SELECT COUNT(*) + 1 FROM poradi as t1 WHERE t1.body > t2.body) AS rank, t2.tym, t2.body FROM poradi as t2 |
||
Kcko Profil |
#11 · Zasláno: 20. 7. 2009, 20:25:06
Mimo tento dotaz ale taky k SP
---------------------------------------- Potrebuji zjistit 4 posledni zapasy konkretnich hracu cili sem si zkusil CREATE PROCEDURE `RESULT` () BEGIN DECLARE done TINYINT(1) DEFAULT 0; DECLARE _id INT; DECLARE _prezdivka VARCHAR(100); DECLARE mycursor CURSOR FOR SELECT id, prezdivka FROM hraci WHERE id IN (1, 11); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN mycursor; myloop: LOOP FETCH mycursor INTO _id, _prezdivka; IF done THEN LEAVE myloop; END IF; SELECT * FROM vysledky WHERE d_hrac = _id OR h_hrac = _id ORDER BY id_zapasu DESC LIMIT 4; END LOOP myloop; CLOSE mycursor; END v PMA to nefunguje neumi zobrazit sadu vysledku z obycejneho Selectu ktery je v SP, nechapu ale je to tak. V Mysql Query Browser dostanu 2 sady vysledku po 4 radcich ( 2 hraci - 4 zapasy ) coz je spravne. Nyni bych k tomu mel nekolik otazek 1/ Jak to vypsat do PHPka , klasickym zpusobem to nejde ( $a = mysql_query("CALL RESULT()"; while ( ... ) ) 2/ Jak bych mohl prostrcit do te procedury nekolik IDcek hracu , jedna se mi o toto id IN (1, 11); , jako bych proste v PHPku udelal array(1,2,3,4) a pak si to zpracoval, je na to v SP nejaky figl? 3/ Jak by tu SP napsal clovek, ktery SP ovlada a neuci se je jako ja a premysli proc je to tolik jine nez klasicke programovani :) Diky Tome |
||
Kcko Profil |
#12 · Zasláno: 20. 7. 2009, 20:55:56
Tak na 1/ si opet odpovim sam ( mysql to neumi ale Mysqli uz ano )
na 2+3 si pockam :) |
||
TomášK Profil |
#13 · Zasláno: 21. 7. 2009, 00:57:45 · Upravil/a: TomášK
Argh. Během dne jsem tu postupně tvořil odpověd, když mi tu něco běželo. Dopisoval jsem poslední řádek a vypadly pojistky... tak znova, aspoň to podstatné.
Ať dělám, co dělám, ten dotaz mi běží pro 1000 řádků vteřiny, pro 5 000 řádků už desítky vteřin až minuty. Zajímalo by mě, jestli za to třeba nemůže nějaký index, mohl bys poslat EXPLAIN toho dotazu? Tu je můj: mysql> EXPLAIN SELECT -> (SELECT COUNT(*) + 1 FROM poradi as t1 WHERE t1.body > t2.body) AS rank, t2.tym, t2.body -> FROM poradi as t2; +----+--------------------+-------+-------+---------------+----------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+-------+---------------+----------+---------+------+------+--------------------------+ | 1 | PRIMARY | t2 | ALL | NULL | NULL | NULL | NULL | 5000 | | | 2 | DEPENDENT SUBQUERY | t1 | index | idx_body | idx_body | 5 | NULL | 5000 | Using where; Using index | +----+--------------------+-------+-------+---------------+----------+---------+------+------+--------------------------+ Jinak pises ze nevis co by to tam mohlo byt z hlediska vypoctu slozite[/] Špatně jsem se vyjádřil. Chtěl jsem říct, že ta chyba neovlivňuje délku výpočtu. Neměl jsem na mysli náročnost procedury. K druhému dotazu: [i]Potrebuji zjistit 4 posledni zapasy konkretnich hracu Jedná se v podstatě o stejný problém, pro jeho řešení platí totéž co pro první otázku. Lze řešit pomocí uložené procedury (rozumně rychlé, spolehlivé), @proměnné (ještě rychlejší, nespolehlivé), korelovaného poddotazu, self joinu (ten tu ještě nepadl, ale šel by asi taky použít). A analytické funkce (PostgreSQL) to umí vyřešit elegantně v jedno selectu. 1, úžasné :) žil jsem v domnění, že tohle MySQL neumí vůbec. Buď jsem kdysi špatně hledal nebo se to v mezičase naučilo. 2, http://forums.mysql.com/read.php?98,90868 z roku 2006. Některé databáze umí posílat jako parametr cursor, v MySQL jsem to nenašel, myslím, že to spíš neumí. Nabízené řešení je tedy předávat to jako řetězec a parsovat to z něj nebo vytvořit pomocnou tabulku, předat jméno té tabulky a pomocí prepared statements z ní vydolovat potřebné. 3, Tu se necítím povolaný, neb se stále učím :) Napsal jsem všehovšudy jeden větší projekt, zato ve třech různých databázích (MySQL, Oracle, MSSQL). Myslím, že by člověk, který SP ovládá zvolil jinou databázi, pokud by měl tu možnost. Tam to řeší efektivně jeden select. MySQL na stejný problém nasazuje dočasnou tabulku, SP, prepaded statement. Z mého pohledu je MySQL dostatečné, pro jednodušší aplikace, v oblasti uložených procedur, transakcí apod. má ještě co dohánět. Mám pocit, že v MySQL vývoj postupuje (snad se nezastaví, když Sun přešel pod Oracle), ale v současném stavu tomu ještě něco chybí. Ale ber to s rezervou, odborníkem se být necítím. |
||
Kcko Profil |
#14 · Zasláno: 21. 7. 2009, 16:48:28 · Upravil/a: Kcko
1/ No taky sem to chvili hledal :)
2/ Abych rekl pravdu toto reseni se mi tedy vubec nelibi ( narazil jsem na nej vcera taktez ) , radsi si ty promenne rozparsuji pomoci STR funkci az to budu potrebovat ( hloupa MYSQL ) 3/ Tak urcite mas vic zkusenosti, jinak vidim ze jedna z rad je docasna tabulka, tak si ty data z cyklu poukladam do ni a pak provedu finalni select Diky za pomoc a ochotu PS. Ten explain Ti vecer hodim PS2. SET @minule := 0; SET @poradi := 0; SET @radek := 1; SELECT tym, body, @poradi := IF(@minule = body, @poradi, @radek) AS poradi, @radek := @radek + 1 AS radek, @minule := body AS tmp FROM poradi ORDER BY body DESC; Muzes zkusit zakomponovat do sveho dotazu UPDATE? ( Aby se to ocislovalo natvrdo, nedari se mi :/ , rad bych to videl ) |
||
TomášK Profil |
#15 · Zasláno: 21. 7. 2009, 19:21:09 · Upravil/a: TomášK
Zkušeností mám zřejmě víc, což ovšem neznamená, že neplácám blbosti, jen možná trochu menší než bys
řekl ty, ale pořád jsou to blbosti. Proto radši kecám do selectů, protože tuším, co od nich čekat, ale nechci kecat do toho, jak správně psát proceduru, protože vím, že to nevím. :) Tu je update: SET @minule := 0; SET @poradi := 0; SET @radek := 1; UPDATE poradi, ( SELECT tym, body, @poradi := IF(@minule = body, @poradi, @radek) AS poradi, @radek := @radek + 1 AS radek, @minule := body AS tmp FROM poradi ORDER BY body DESC ) AS vypocet SET poradi.poradi = vypocet.poradi WHERE poradi.tym = vypocet.tym; |
||
Kcko Profil |
#16 · Zasláno: 21. 7. 2009, 20:00:29
1/
INDEX Zobrazeny záznamy 0 - 29 (10 000 celkem, Dotaz zabral 0.2150 sekund) id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 9751 2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 9751 Using where 2/ BEZ INDEXU Zobrazeny záznamy 0 - 29 (10 000 celkem, Dotaz zabral 0.2087 sekund) id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 10426 2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 10426 Using where SELECT SQL_NO_CACHE (SELECT COUNT(*) + 1 FROM poradi as t1 WHERE t1.body > t2.body) AS rank, t2.tym, t2.body FROM poradi as t2 Prijde mi to proste hrozne rychle ... Jinak diky za update ale moc nefunguje, kazdemu tymu nasadi poradi "1" PS. Mozna bychom to tu nemuseli dale resit, soukromne ? Nebo si obcas profesne napsat? :) Kontakt mam v profilu ( email / ICQ / msn ) |
||
Kcko Profil |
#17 · Zasláno: 21. 7. 2009, 20:16:33
PS2. Omlouvam se, mel sem vsecky ID Tymu jako 0 boze !!!
|
||
TomášK Profil |
#18 · Zasláno: 21. 7. 2009, 20:49:56 · Upravil/a: TomášK
1, Zobrazeny záznamy 0 - 29
bodejť by to nebylo rychlé, očísluje prvních 30 záznamů a o zbytek se nestará :) Phpmyadmin ti automaticky doplní limit 0, 30, pokud mu tam nic nezadáš. Doplň tam LIMIT 0, 10 000 a dostaneš se na mé časy. 2, Update jsem zkoušel a mě funguje - což je přesně důvod, proč @proměnným moc nevěřím - můžou se chovat pokaždé jinak - zřejmě máš jinou verzi MySQL nebo jinou konfiguraci. Netuším, co změnit, aby ti to taky fungovalo. Možná prohodit pořadí řádků, přidat k @minule = body nějakou ohavnost jako umocnit na druhou a odmocnit, aby se to počítalo dýl (jenom za to, že jsem tohle řekl nahlas si uděluju tři prasátka:) ) nebo zkusit černou magii. Podobné bugy bývají docela zákeřné - přehraješ aplikaci na jiný server a najednou to přestane fungovat. Na ICQ (jabberu) teď cíleně nejsem, mohli bychom to řešit po mailu, pokud se ti to zdá o hodně lepší, ale mě zdejší diskuze docela vyhovuje. Mám pocit, že necháváme odkaz budoucím generacím - až někdo bude googlit stejné problém, bude mít radost, až to najde, mail by zanikl v historii dějin. Plus tu vidím několik výhod, že až plácnu něco úplně mimo, tak třeba přijde někdo chytřejší a řekne mi to :) A taky se tu cítím svobodněji ve smyslu, že nemusím odpovídat (pokud bych z nějakého důvodu nechtěl/nemohl) a většinou se najde někdo jiný, kdo odpoví... Edit: neměl jsem tu tvůj poslední post, když jsem to psal. Škoda, takový dobrý argument proti @proměnným mi to dalo:) |
||
Kajman_ Profil * |
#19 · Zasláno: 21. 7. 2009, 22:09:54
Co to pořadí vypočítat přes dva updaty. Jednou normálně s rankem, jak je ve faq - jedinečné pořadí. Pak druhý update, který zgrupuje stejněbodové týmy a vybere u nich min?
|
||
Kcko Profil |
#20 · Zasláno: 22. 7. 2009, 09:20:40
TomášK
1/ A joo :) no hezky sem se predvedl 2/ Vyreseno ( moje chyba vsechny tymy mely ID 0 ) add kontakt) Ok beru to :) Kajman_ Tak zkus :) Jinak to uz asi uzavreme, myslim ze jsme vyzkouseli snad vse |
||
Kajman_ Profil * |
#21 · Zasláno: 22. 7. 2009, 09:39:25
Jedinečné pořadí určitě zvládneš.
Druhý update by mohl být... update tabulka, (select body1, body2, body3, min(poradi) poradi from tabulka group by body1, body2, body3 having count(*) > 1) as vypocet set tabulka.poradi = vypocet.poradi where tabulka.body1 = vypocet.body1 and tabulka.body2 = vypocet.body2 and tabulka.body3 = vypocet.body3 Rychlost asi výrazně ovlivní složený index (body1,body2,body3) |
||
Kcko Profil |
#22 · Zasláno: 22. 7. 2009, 10:22:26
Kajmane diky, jeste sem to nezkusil, ale uz jen tak od pohledu body1, body2, body3 to je co? To moc neodrazi nas priklad ... ?
|
||
Kajman_ Profil * |
#23 · Zasláno: 22. 7. 2009, 10:28:34
Mam vypis tymu, sesortovany podle urcitych parametru ( body, vstrelene goly, obdrzene goly atd.)
Do příkladu asi stačí dát jen body jedny. |
||
Kcko Profil |
#24 · Zasláno: 22. 7. 2009, 10:32:50
Aha promin, jasne, jdu to vyzkouset.
|
||
Kcko Profil |
#25 · Zasláno: 22. 7. 2009, 10:54:36
Kajmane, opet musim smeknout.
Diky oboum zucastnenym o obohaceni :-) |
||
TomášK Profil |
#26 · Zasláno: 22. 7. 2009, 12:05:28
I já děkuju Kajmanovi za obohacení, dva updaty mě nenapadly. Jednoduché, rychlé...myslím, že mi tahle idea ještě hodněkrát ušetří psaní procedur :)
|
||
Časová prodleva: 15 let
|
0