anonīms Posted November 1, 2008 Report Share Posted November 1, 2008 Tātad ir 2 tabulas. `rezultati` un `komandas`. komandas ir nepieciešams noORDERot pēc punktu skaitiem. - Vienīgā problēma - šie punkti tiek skaitīti no pavisam citas tabulas. ja viss būtu vienā tad derētu SELECT * FROM komandas ORDER BY punkti DESC , bet šajā gadijumā es tiešām nezinu... punkti tiek skaitīti no `rezultati`, kur tie saskaitīti cik reizes šai komandai ir bijs rezultāts lielāks nekā komanda2. Kā varētu panākt to, lai ORDERo pēc punktiem? Cerams sapratāt... Link to comment Share on other sites More sharing options...
cucumber Posted November 1, 2008 Report Share Posted November 1, 2008 (edited) 1) ja ir divas tabulas izmanto join vai salidzinashanu ps. esi kludijies ar sadalu Edited November 1, 2008 by cucumber Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 2, 2008 Report Share Posted November 2, 2008 Kā jau teikts, tad var izmantot kādu no tabulu savienojumu veidiem, visdrīzāk iekšējo savienojumu, ja katrai komandai rezultātu tabulā ir vismaz viens ieraksts, vai ārējo savienojumu, ja ierakstu rezultātu tabulā var arī nebūt. Pie tam droši vien, ka noderīgi šai gadījumā ir atcerēties vēl 2 lietas: 1) savienojumus var veidot ne tikai ar tabulām, bet arī apakšpieprasījumiem (jo droši vien rezultātu tabulā katrai komandai ir vairāk nekā viens rezultāta ieraksts) 2) Order by klauzā var izmantot arī tās kolonas, ko nemaz neatlasa Select izteiksmē. Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
anonīms Posted November 2, 2008 Author Report Share Posted November 2, 2008 Paldies par linku, izlasiju. Bet tomēr nevarēju neko sakarīgi izdomāt, jo manuprāt tur ir vnk par to kā pievienot citas kollonas no citas tabulas. Tas man būtu skaidrs. Bet manā gadijumā vajag tā kods ņemts no punktu skaitīšanas, katrai komandai, kad $_GET['id'] if($_GET['page'] == 'teams' AND $_GET['id']) { $komandas_dati = mysql_query("SELECT id, komandas_nosaukums, komandas_tags, komandas_valsts, komandas_majaslapa, komandas_tips, komandas_kapteinis, komandas_logo FROM gamefarm_komandas WHERE id = {$_GET['id']}"); $komanda = mysql_fetch_array($komandas_dati); $uzvaretas_speles = mysql_query("SELECT count(km1) FROM gamefarm_rezultati WHERE km1 = '$komanda[0]'"); $uzvaretas_speles = mysql_fetch_array($uzvaretas_speles); $uzvaretas_speles = $uzvaretas_speles['count(km1)']; $zaudetas_speles = mysql_query("SELECT count(km2) FROM gamefarm_rezultati WHERE km2 = '$komanda[0]'"); $zaudetas_speles = mysql_fetch_array($zaudetas_speles); $zaudetas_speles = $zaudetas_speles['count(km2)']; $speles_kopa = $uzvaretas_speles+$zaudetas_speles; $neizskirtas_speles = mysql_query("SELECT count(*) FROM gamefarm_rezultati WHERE km1 = '$komanda[0]' AND km1_rez=km2_rez") or die(mysql_error()); $neizskirtas_speles = mysql_fetch_array($neizskirtas_speles); $neizskirtas_speles = $neizskirtas_speles[0]; $neizskirtas_speles = mysql_query("SELECT count(*) FROM gamefarm_rezultati WHERE km1 = '$komanda[0]' AND km1_rez=km2_rez") or die(mysql_error()); $neizskirtas_speles = mysql_fetch_array($neizskirtas_speles); $neizskirtas_speles = $neizskirtas_speles[0]; $neizskirtas_speles1 = mysql_query("SELECT count(*) FROM gamefarm_rezultati WHERE km2 = '$komanda[0]' AND km1_rez=km2_rez") or die(mysql_error()); $neizskirtas_speles1 = mysql_fetch_array($neizskirtas_speles1); $neizskirtas_speles1 = $neizskirtas_speles1[0]; $neizskirtas_speeles = $neizskirtas_speles+$neizskirtas_speles1; $komandas_punkti = round($uzvaretas_speles*2+$neizskirtas_speeles-$zaudetas_speles); } un lapa kurai to taisu ir izvilktas visas komandas, kuras vajag noorderot BY $komandas_punkti mysql_query("SELECT * FROM <tabula> ORDER BY $komandas_punkti DESC"); Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 2, 2008 Report Share Posted November 2, 2008 Es jau teicu, ka savienot (veidot join) var NE TIKAI tabulas. Ja es pareizi sapratu, tad kaut kas tāds varētu derēt: mysql> create table gamefarm_rezultati ( -> km1 integer, -> km2 integer, -> km1_rez integer, -> km2_rez integer); Query OK, 0 rows affected (0.14 sec) mysql> insert into gamefarm_rezultati values (1, 12, 1, 0); Query OK, 1 row affected (0.05 sec) mysql> insert into gamefarm_rezultati values (1, 12, 0, 5); Query OK, 1 row affected (0.05 sec) mysql> insert into gamefarm_rezultati values (3, 1, 3, 3); Query OK, 1 row affected (0.06 sec) mysql> insert into gamefarm_rezultati values (3, 2, 1, 1); Query OK, 1 row affected (0.03 sec) mysql> insert into gamefarm_rezultati values (2, 1, 0, 1); Query OK, 1 row affected (0.03 sec) mysql> create table gamefarm_komandas ( -> id integer, nosaukums varchar(15)); Query OK, 0 rows affected (0.05 sec) mysql> insert into gamefarm_komandas values (1, 'teletuubiji'); Query OK, 1 row affected (0.03 sec) mysql> insert into gamefarm_komandas values (2, 'jokeri'); Query OK, 1 row affected (0.03 sec) mysql> insert into gamefarm_komandas values (3, 'treshie'); Query OK, 1 row affected (0.03 sec) mysql> insert into gamefarm_komandas values (12, 'ducis'); Query OK, 1 row affected (0.03 sec) select id, nosaukums from gamefarm_komandas left join (select km, sum(punkti) kom_pti from ( select km1 km, case when km1_rez > km2_rez then 2 when km1_rez = km2_rez then 1 else 0 end punkti from gamefarm_rezultati union all select km2 km, case when km2_rez > km1_rez then 2 when km1_rez = km2_rez then 1 else 0 end punkti from gamefarm_rezultati ) t group by km) t1 on (id = t1.km) order by kom_pti desc; +------+-------------+ | id | nosaukums | +------+-------------+ | 1 | teletuubiji | | 12 | ducis | | 3 | treshie | | 2 | jokeri | +------+-------------+ 4 rows in set (0.00 sec) Ja nesaproti kā tas kopā sanāk, tad papildi katru apakšvaicājumu atsevišķi ;) Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
anonīms Posted November 2, 2008 Author Report Share Posted November 2, 2008 Jā, viss strādā perfekti. Vēl tikai kā varu izvadīt tos punktus? nu echo punkti, lai rādas aiz komandas nosaukuma. +------+-------------+ | id | nosaukums | +------+-------------+ | 1 | teletuubiji punkti: 12 | | 12 | ducis punkti: 9 | | 3 | treshie punkti: 7 | | 2 | jokeri punkti: 5 | +------+-------------+ Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 2, 2008 Report Share Posted November 2, 2008 http://dev.mysql.com/doc/refman/6.0/en/str...function_concat Gints Plivna http://datubazes.wordpress.com/ Link to comment Share on other sites More sharing options...
anonīms Posted November 2, 2008 Author Report Share Posted November 2, 2008 (edited) Nav skaids par concat. Sanāk, ka nemaz nav mysql kverijā jānorāda FROM? :\ mysql_query("SELECT concat(<ko te jāraksta?> un tālāk, kas aiziet? Edited November 2, 2008 by anonīms Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 2, 2008 Report Share Posted November 2, 2008 Nu manā augšminētajā vaicājumā tā kolona ir aliasota (pielietots aizstājējvards) kom_pti. Droši vien labāk būtu, ja konkatenāciju tomēr veiktu php līmenī, jo MySQLs normāli atgriež datus, kurus tad tālāk noformē php, vai kas cits. Jā un MySQLā from nav obligāta klauza, konstantes un izteiksmes vienai rindai var atlasīt tāpat. Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
anonīms Posted November 2, 2008 Author Report Share Posted November 2, 2008 (edited) Tātad vajadzētu būt kaut kam līdzīgam $punkti = mysql_query("SELECT concat(kom_pti)"); un kā tālāk? mysql_fetch_array šajā gadijumā neder. Edited November 2, 2008 by anonīms Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 2, 2008 Report Share Posted November 2, 2008 Klau nu takš padomā ar galvu un mēģini saprast, kas tur notiek. To kom_pti vajag pielikt iekš select saraksta select id, nosaukums, kom_pti ... Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
anonīms Posted November 3, 2008 Author Report Share Posted November 3, 2008 select id, komandas_nosaukums, komandas_valsts, kom_pti from gamefarm_komandas left join (select km, sum(punkti) kom_pti from ( select km1 km, case when km1_rez > km2_rez then 2 when km1_rez = km2_rez then 1 else -1 end punkti from gamefarm_rezultati union all select km2 km, case when km2_rez > km1_rez then 2 when km1_rez = km2_rez then 1 else -1 end punkti from gamefarm_rezultati ) t group by km) t1 on (id = t1.km) order by kom_pti desc else uzliku uz -1, jo par zaudējumi -1 ies. Tikai kapēc orderots tiek tā?: #1 eclipse Punkti: 6#2 test Punkti: 3 #3 Vfor Punkti: 2 #4 gansi Punkti: -4 #5 immense Punkti: 0 #6 FeeL-IT Punkti: 0 -4 vajag būt zem 0 Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 3, 2008 Report Share Posted November 3, 2008 (edited) Tās 0 nav gadījumā tāpēc, ka immense un FeeL-IT vispār nav neko vēl nospēlējuši un rezultātu tabulā ierakstu nav t.i. kom_pti ir NULL, nevis 0 un drukājot vienkārši NULL aizstāj ar 0? Ja gadījumā tā, tad vari pierakstīt coalesce(kom_pti, 0) gan select listā gan order by klauzā. Gints Plivna http://datubazes.wordpress.com Edited November 3, 2008 by Gints Plivna Link to comment Share on other sites More sharing options...
anonīms Posted November 4, 2008 Author Report Share Posted November 4, 2008 (edited) select id, komandas_nosaukums, komandas_valsts, kom_pti from gamefarm_komandas left join (select km, sum(punkti) kom_pti from ( select km1 km, case when km1_rez > km2_rez then 2 when km1_rez = km2_rez then 1 else -1 end punkti from gamefarm_rezultati union all select km2 km, case when km2_rez > km1_rez then 2 when km1_rez = km2_rez then 1 else -1 end punkti from gamefarm_rezultati ) t group by km) t1 on (id = t1.km) order by coalesce(kom_pti, 0) desc par order vietu sapratu, tagad tiek grupēts pareizi, un mans kods vēl bija if($overview['kom_pti'] == 0) { $punkti = '0'; } Mēģināju ievietot pirmajā selectā coalesce, bet tad visiem punkti ir 0 Mēģināju select km, sum(punkti) kom_pti from, bet tad izmet erroru par neeksistējošu lauku. Pašlaik grupē tā. #1 eclipse Punkti: 6#2 test Punkti: 3 #3 Vfor Punkti: 2 #4 immense Punkti: 0 #5 FeeL-IT Punkti: 0 #6 gansi Punkti: -4 0 // Negatīvajam viņš arī uzskata, ka ir NULL vai 0 overview['punkti'] - Kurā selectā jāraksta coalesce(kom_pti, 0) ? Edited November 4, 2008 by anonīms Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 4, 2008 Report Share Posted November 4, 2008 (edited) select id, komandas_nosaukums, komandas_valsts, coalesce(kom_pti, 0) kom_pti from gamefarm_komandas Tagad izteiksme ir aliasota, iespējams, ka tur bija problēmas, jo vispār kolona pēc tā coalesce(kom_pti, 0) jau vairs nesaucas vienkārši kom_pti. BTW galīgi nenāktu par ļaunu palasīties šo to par SQL pamatiem un vaicājumu veidošanu, jo nu jautājumi ir baisi tādi nu kā lai tā maigāk pasaka - sajūta, ka absolūti nekā nesaproti un grābsties galīgi uz aklo pa tumsu... Jā un vēl protams piekasīšanās bet teksts "tagad tiek grupēts pareizi" nav korekts. Tiek __kārtots__ pareizi, t.i., tā kā biji iecerējis. kārtot <> grupēt. Gints Plivna http://datubazes.wordpress.com Edited November 4, 2008 by Gints Plivna Link to comment Share on other sites More sharing options...
Recommended Posts