Rank αποτελεσματων

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
caspave
Δημοσιεύσεις: 22
Εγγραφή: 24 Μαρ 2009 19:54

Rank αποτελεσματων

Δημοσίευση από caspave » 29 Μάιος 2009 01:55

Γεια!
Εχω ενα μικρο προβλημα με κατι που θελω να κανω στην mysql.
Πιο συγκεκριμενα:

Εστω ο πινακας `apotelesmata` ο οποιος εχει τα πεδια: Παιχνιδι , Λεφτα , Παικτης
(με την υποθεση οτι: στον πινακα αποθηκευονται τα id των παικτων. Ο καθε παικτης παιζει ενα παιχνιδι (πχ τζοκερ,κινο,προπο κλπ) και κερδιζει καποια λεφτα.)
Και εστω οτι ο πινακας ειναι πχ:
Παιχνιδι , Λεφτα , Παικτης
joker 4510 25
kino 1300 22
joker 2600 25
propo 1200 12
joker 5550 13
joker 4300 45

(τα παιχνιδια ειναι βασικα με id οπου πχ 1=joker , 2=propo κλπ)
Αυτο που θελω να κανω ειναι το εξης:
Οταν βλεπεις πχ τα στατιστικα του παικτη με το id=25, να σου δειχνει την καταταξη που εχει σε σχεση με τους αλλους παικτες στο ιδιο παιχνιδι.(η καταταξη βασιζεται στα μεγιστα λεφτα που εχει κερδισει.)
Πχ για το joker o παικτης 13 ειναι 1/3 (πρωτος απο τους 3 συνολικα) , ο παικτης 25 ειναι 2/3 ενω ο παικτης 45 ειναι τελευταιος (3/3)

Αυτο πως θα το κανω?

Μεχρι στιγμης εχω κανει τα εξης:

Κώδικας: Επιλογή όλων

($apotelesmatap=) 'SELECT max(`apotelesmata`.`lefta`), `paixnidia`.`onomapaixnidiou`, `paixnidia`.`proteuonkleidi` 
FROM `apotelesmata`, `paixnidia` 
WHERE `paixnidia`.`proteuonkleidi`=`apotelesmata`.`paixnidi` AND `apotelesmata`.`paiktis`='.$touseridtoupaikti.' 
GROUP BY `paixnidi`
ORDER BY `paixnidia`.`onomapaixnidiou` ASC;' , 3 , 0);

μετα

Κώδικας: Επιλογή όλων


foreach ($apotelesmatap as $apot) {
sql που μετραει ποσα ειναι συνολικα ($posaapotelesmata)

και μετα:
($emfanisi=) 'SELECT max(`apotelesmata`.`lefta`)
		FROM `apotelesmata`
		WHERE `apotelesmata`.`paixnidi`='.$apot[2].'
		GROUP BY `paiktis`
		
		;' , 3 , 0);

μετα:

$icounter = 0;
		while&#40;$icounter < $posaapotelesmata&#41; &#123;
foreach &#40;$emfanisias $emf&#41; &#123;
		echo 'posesfores--'.$emf&#91;0&#93;&#91;0&#93;.'--';
&#125;			
		$icounter++;
&#125;

&#125;

&#125;

anyway,καπως μπερδεμενο ειναι ε?
αλλα που κανω το λαθος?

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Rank αποτελεσματων

Δημοσίευση από fafos » 29 Μάιος 2009 03:46

an sou po oti zalisthka apo ta back-quotes tha me pistepseis? :lol:

dystyxos den exo kairo na to koitakso analytika (eipame ksemperdeuo to paragadi) alla auto ginetai xrhsimopoiontas tis sum(), JOIN kai GROUP... epishs kopse auta ta back-quotes: `paixnidia`.`proteuonkleidi` => `paixnidia.proteuonkleidi`

epishs.. to max() pisteuo oti se mperdeuei perissotero para se dieukolynei..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Rank αποτελεσματων

Δημοσίευση από Rapid-eraser » 30 Μάιος 2009 12:49

Μια διευκρίνηση μόνο ... τα back quotes καλά κάνεις και τα βάζεις. Στην mysql δεν υπάρχει το `paixnidia.proteuonkleidi` πρέπει κάθε διακριτή μονάδα (`βάση`.`πίνακας`.`πεδίο`) να είναι κλεισμένη στα δικά της boundry σε αυτή την περίπτωση back quotes.
**(υπενθυμίζω ότι τα back quotes, είναι ο μοναδικός τρόπος να κάνεις χρήση σε tables/cells με reserved λέξεις πχ: πεδίο με όνομα select)

όσον αφορά το δεύτερο μέρος αρχικά θα σου δώσω tips και άμα δεν βγάλεις άκρη θα σου δώσω (αν δεν έχει προλάβει κάποιος άλλος ) κώδικα.

Αρχικά το GROUParisma που κάνεις πολώνει τα data ανά ομάδες, αυτό όμως είναι χρήσιμο όταν θες γενικά στατιστικά από όλο τον πίνακα για κάθε παιχνίδι ξεχωριστά.

Αυτό που σου προτείνω εγώ έχει ως εξής :
1) Ένα SELECT που να επιστρέφει το σύνολο των εγγραφών στο συγκεκριμένο game (μπορείς να κάνεις χρήση της COUNT(*) για να το κάνεις με ένα τράβηγμα.)
2) Ένα SELECT που να σου επιστρέφει το σύνολο των εγγραφών στο συγκεκριμένο game με τις εγγραφές όμως που έχουνε μικρότερο σκορ.

Αν κάνεις την πράξη (σύνολο εγγραφών)-(μικρότερες εγγραφές) θα βρεις την θέση του στο συγκεκριμένο game.


Αυτό που παρατήρησα είναι ότι στον πίνακα με τα data το id του παίκτη 25 να έχει 2 εγγραφές στο ίδιο game με διαφορετικό ποσό.
Αν αυτό ισχύει είναι λάθος κανονικοποίησής και θα πρέπει να υπάρχει μόνο 1 εγγραφή ανά παίκτη/game .
Αλλιώς θα πρέπει να κάνεις sum στα data όπως σου είπε ο fafos.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
caspave
Δημοσιεύσεις: 22
Εγγραφή: 24 Μαρ 2009 19:54

Rank αποτελεσματων

Δημοσίευση από caspave » 14 Ιουν 2009 16:19

Δυστυχως μεχρι στιγμης τιποτα :(

Λοιπον, σχετικα με αυτο:
Αυτό που παρατήρησα είναι ότι στον πίνακα με τα data το id του παίκτη 25 να έχει 2 εγγραφές στο ίδιο game με διαφορετικό ποσό.
Αν αυτό ισχύει είναι λάθος κανονικοποίησής και θα πρέπει να υπάρχει μόνο 1 εγγραφή ανά παίκτη/game .
Κοιτα,ενας παικτης (εστω αυτος με id=25) μπορει να παιξει πχ 10 φορες το joker.Καθε φορα κερδιζει διαφορα λεφτα.
Εγω αυτο που θελω ειναι να παρουμε-βρουμε τα μεγιστα (γι'αυτο χρησιμοποιω το max) λεφτα που εχει κερδισει εως τωρα - και οχι μονο αυτου, αλλα και των αλλων - και να τα συγκρινουμε για να βρουμε το rank του.

Δηλαδη,
το joker το επαιξαν 15 ατομα.
To μελος με id=25 (που επαιξε και αυτος) εχει θεση 2/15 (εχει κερδισει το μεγιστο 15000ευρω - ενω ο πρωτος πχ 17500 ευρω)
(ομοιως εστω το μελος με id=57 , εχει κερδισει το μεγιστο 2500ευρω - η θεση του ειναι 11/15)


Εγω κατω αυτο:

Κώδικας: Επιλογή όλων

$icounter = 1;
		while&#40;$icounter <= $posaskoranapaixnidi&#41; &#123;
			foreach &#40;$emfanisi as $emf&#41; &#123;
			if &#40;$apot&#91;0&#93; = $emf&#91;0&#93;&#91;0&#93;&#41; &#123;
			$teliko= $icounter;
			&#125;
			&#125;
		$icounter++;
		&#125;

echo 'Αποτελεσμα&#58; '.$teliko.'/'.$posaskoranapaixnidi.'';
		
(apot,emfanisi συμφωνα με το πρωτο post μου)

Αλλα τα βγαζει λαθος :(

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Rank αποτελεσματων

Δημοσίευση από fafos » 14 Ιουν 2009 16:43

se auto pou zhtas kathe paixths tha emfanizetai mono me to megalytero poso h an exei kapoio allo poso tha ton emfanizei pali... gia paradeigma... o fafos exei kerdisei sto lotto 1000 kai 800 kai to totos exei kerdisei 900.. h lista tha einai etsi:

fafos 1000
totos 900
fafos 800


h den tha emfanizei ton fafo sthn 3h timh (fafos 800) alla kapoion allon paixth esto kai an exei ligotera kerdh apo 800?
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
caspave
Δημοσιεύσεις: 22
Εγγραφή: 24 Μαρ 2009 19:54

Rank αποτελεσματων

Δημοσίευση από caspave » 14 Ιουν 2009 16:59

οχι, μονο με το μεγαλυτερο

δηλαδη,στο παραδειγμα σου:
fafos 1000
totos 900
fafos 800
τα rank ειναι:

fafos: 1/2
totos: 2/2

(δηλαδη παιρνει την μεγιστη τιμη του καθε παικτη και υπολογιζει την θεση του με βαση τις μεγιστες τιμες των αλλων παικτων)

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Rank αποτελεσματων

Δημοσίευση από fafos » 14 Ιουν 2009 17:32

Loipon...

ypothetoume oti exeis 3 pinakes sthn vash sou:

1. games: id, onoma
2. paixtes: id, onoma
3. apotelesmata: id, paixnidi, lefta, paixtis


Gia arxh zhtame na mas tavhksei ta paixnidia pou exoume sthn vash mas me ena query..


sto while autou tou query zhtame ena allo query opou travaei ola ta apotelesmata, ta grouparei me to id tou paixti kai ta taksinomei apo to megalytero pros to mikrotero:

Κώδικας: Επιλογή όλων


<?php
$id_paixth = 1;
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'paixnidi';

$table = 'paixnidia';
// ------------------------

$db = mysql_connect&#40;$db_host, $db_user, $db_pass&#41;;
 mysql_select_db&#40;$db_name, $db&#41;;

$q = "select * from games  ORDER BY name ASC";
$r = mysql_query&#40;$q&#41; or die&#40;mysql_error&#40;&#41;&#41;;


if&#40;mysql_num_rows&#40;$r&#41; > '0'&#41;
&#123;

	while&#40;$a = mysql_fetch_array&#40;$r&#41;&#41;
	&#123;


echo '<br>_______'.$a&#91;name&#93;.'_____________<br>';


$q1 = "SELECT paixtes.id, paixtes.onoma, apotelesmata.paixtis,   MAX&#40;apotelesmata.lefta&#41; as count  FROM paixtes LEFT JOIN apotelesmata ON  paixtes.id = apotelesmata.paixtis WHERE apotelesmata.paixnidi='$a&#91;id&#93;'  GROUP BY  paixtes.onoma ORDER BY count DESC  LIMIT 5";
$r1 = mysql_query&#40;$q1&#41; or die&#40;mysql_error&#40;&#41;&#41;;

if&#40;mysql_num_rows&#40;$r1&#41; > '0'&#41;
&#123;

	while&#40;$aa = mysql_fetch_array&#40;$r1&#41;&#41;
	&#123;

if&#40;$aa&#91;id&#93; == $id_paixth&#41; &#123;

echo '<b>'.$aa&#91;onoma&#93;.' - '.$aa&#91;count&#93;.'</b><br>';
&#125; else &#123;echo $aa&#91;onoma&#93;.' - '.$aa&#91;count&#93;.'<br>';
&#125;
	&#125;


&#125;



	&#125;

&#125;

?>


To $id_paixth = 1; einai ena theorhtiko id kapoiou apo tous paixtes mas.. gia paradeigma eimai o paixths fafos me id=1 kai mpaino na do ta apotelesmata... to systhma arpazei thn session me to id mou (h opoion allo tropo xrhsimopoio) kai opou anagrafete to onoma mou sta scores to kanei bold:

Κώδικας: Επιλογή όλων

if&#40;$aa&#91;id&#93; == $id_paixth&#41; &#123;
echo '<b>'.$aa&#91;onoma&#93;.' - '.$aa&#91;count&#93;.'</b><br>';
&#125; else &#123;echo $aa&#91;onoma&#93;.' - '.$aa&#91;count&#93;.'<br>';
&#125;
ta ypoloipa onomata ta afhnei se normal.. auto vevea einai optional kai an thes to deixneis.. to apotelesma se mia dokimastikh vash tha einai auto:

_______joker_____________
totos - 12000
nikos - 6500
fafos - 3000

_______lotto_____________
fafos - 5000
totos - 3500
nikos - 1200

_______propo_____________
totos - 3000
nikos - 1000
fafos - 500



den to exo polydokimasei alla paikse mazi tou mhpos petaei tipota lathos apotelesmata
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
caspave
Δημοσιεύσεις: 22
Εγγραφή: 24 Μαρ 2009 19:54

Rank αποτελεσματων

Δημοσίευση από caspave » 14 Ιουν 2009 17:44

Ωραια,σ'ευχαριστω!
θα το κοιταξω και θα σου πω!

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες