anonīms Posted May 17, 2010 Report Share Posted May 17, 2010 Tabula speles (km1, km2, km1_rez, km2_rez) dati 1, 2, 4, 3 1, 2, 8, 2 2,1,7,3 Komandai ar ID nepieciešams izvilkt, ka viņa ir uzvarējusi 2 spēles pēc kārtas. Kā to varētu panākt? Quote Link to comment Share on other sites More sharing options...
marcis Posted May 17, 2010 Report Share Posted May 17, 2010 Un kas nosaka ierakstu secību? Quote Link to comment Share on other sites More sharing options...
bobsters Posted May 17, 2010 Report Share Posted May 17, 2010 noteikti jau ka ID! Quote Link to comment Share on other sites More sharing options...
anonīms Posted May 17, 2010 Author Report Share Posted May 17, 2010 tieši tā, ID Quote Link to comment Share on other sites More sharing options...
php newbie Posted May 17, 2010 Report Share Posted May 17, 2010 ar parasto while ej cauri visām komandas spēlēm // SELECT speles WHERE km1 == komanda OR km2 == komanda tad pārbaudi cik daudz spēles pēc kartas ir uzvarētas if(uzvara) { $uzvaru_skaits_pec_kartas += 1; } else { $uzvaru_skaits_pec_kartas = 0; } if($uzvaru_skaits_pec_kartas > 2) { // ok } man izkskatās ka labāk izdomāt citu "speles" tabulas struktūru, jo jo talāk jo trakāk Quote Link to comment Share on other sites More sharing options...
Леший Posted May 17, 2010 Report Share Posted May 17, 2010 Ja tiec pie insert/update skriptiem tabulai, izdari to tajos. Piemēram, ja uzvara, incrementējam fieldu, ja zaudējums, tad ierakstam nulli. Būs tev uzvarētās spēles pēc kārtas. Ja netiec, tad būtu jārakstā proceduru, vai nu jātaisā šo iekš PHP. Quote Link to comment Share on other sites More sharing options...
anonīms Posted May 18, 2010 Author Report Share Posted May 18, 2010 Леший, varētu nedaudz precizēt. Par lauku viss skaidrs. win (tinyint(1) [0/1], bet kā vēlāk izvilkt precīzi ārā to in row? Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted May 18, 2010 Report Share Posted May 18, 2010 Var arī SQLā. Ja MySQLā būtu vēl kāds elegantāks risinājums kā ģenerēt numurus pēc kārtas, tad vispār nebūtu bēdas. Un vēl - vai tiešām, tiešām ir tik grūti iedot create table skriptus un insert skriptus, lai tiem, kas mēģina nav tie jāsacer pašiem??????? OK tabula un dati: mysql> create table games (id int, km1 int, km2 int, rez1 int, rez2 int); Query OK, 0 rows affected (1.59 sec) mysql> insert into games values (1, 1, 2, 4, 8), (2, 1, 2, 6, 3), -> (4, 1, 2, 4, 8), (5, 1, 2, 5, 3), (7, 2, 1, 3, 5); Query OK, 5 rows affected (0.22 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM games ORDER BY id; +------+------+------+------+------+ | id | km1 | km2 | rez1 | rez2 | +------+------+------+------+------+ | 1 | 1 | 2 | 4 | 8 | | 2 | 1 | 2 | 6 | 3 | | 4 | 1 | 2 | 4 | 8 | | 5 | 1 | 2 | 5 | 3 | | 7 | 2 | 1 | 3 | 5 | +------+------+------+------+------+ 5 rows in set (0.00 sec) Vaicājums: mysql> SET @row1 = 0; Query OK, 0 rows affected (0.00 sec) mysql> SET @row2 = 0; Query OK, 0 rows affected (0.00 sec) mysql> SET @search = 1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT id1, id2 FROM ( -> SELECT t1.id id1, t2.id id2, -> CASE WHEN t1.km1 = @search AND t1.rez1 > t1.rez2 THEN 1 -> WHEN t1.km2 = @search AND t1.rez2 > t1.rez1 THEN 1 -> ELSE 0 -> END AS rez1, -> CASE WHEN t2.km1 = @search AND t2.rez1 > t2.rez2 THEN 1 -> WHEN t2.km2 = @search AND t2.rez2 > t2.rez1 THEN 1 -> ELSE 0 -> END AS rez2 -> FROM ( -> SELECT @row1 := @row1 + 1 AS Row, t.* -> FROM games t -> WHERE km1 = @search OR km2 = @search -> ORDER BY id) t1 -> INNER JOIN ( -> SELECT @row2 := @row2 + 1 AS Row, t.* -> FROM games t -> WHERE km1 = @search OR km2 = @search -> ORDER BY id) t2 -> ON t1.row + 1 = t2.row) t -> WHERE rez1 = 1 AND rez2 = 1; +------+------+ | id1 | id2 | +------+------+ | 5 | 7 | +------+------+ 1 row in set (0.03 sec) spēles 5 un 7 ir tās kurās vinne bijusi pēc kārtas. Ja nesaproti, kā dabūja gala rezultātu, laid pa apakšselektiem :) Ideja - vispirms sakārtojam tās spēles kuras piedalās attiecīgā @search definēta komanda pēc kārtas. Tad taisam self joinu lai dabūtu nākošo spēli. Tā kā idi var izkrist, noteikti ir vairāk nekā 2 komandas, utt tad nevar pa taisno joinot idus pieskaitot klāt 1, tāpēc ir tas numurs pēc kārtas. Tālāk jau ir vienķarši noskaidrojam vai pirmajā spēlē vinnēja @search komanda un noskaidrojam vai otrajā spēlē vinnēja @search komanda. Ja abās vinnēja, tad 2 pēc kārtas. Gan jau ka uz lieliem datiem pasākums nebūs ātrs. Nesaku, ka šis ir vienīgais risinājums, kā to dabūt SQLā. Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.