Jump to content
php.lv forumi

ORDER BY ir ārpus WHILE


anonīms

Recommended Posts

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

1) ja ir divas tabulas izmanto join vai salidzinashanu

 

 

ps. esi kludijies ar sadalu

Edited by cucumber
Link to comment
Share on other sites

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

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

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

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

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

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

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 by Gints Plivna
Link to comment
Share on other sites

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 by anonīms
Link to comment
Share on other sites

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 by Gints Plivna
Link to comment
Share on other sites

×
×
  • Create New...