J'ai des joueurs (stockés dans une table) situés sur différentes planètes (champs pseudo, score, planete)... chaque 4 jours, je vérifie les scores sur chaque planète :
je prend 1/3 des premiers en scores et je l'ai fait avancer vers la planète suivante, les 1/3 suivants restent sur la même planete, et les derniers joueurs restants reculent d'une planete.
Au niveau de l'algorithme, ce n'est pas trop compliqué...
Je crée une table tampon identique à celle d'origine.
pour chaque planète :
1) calculer le nombre de candidats sur cette planète.
2) calculer le nombre de joueurs qui montent, qui restent et qui descendent ainsi que leur rang dans la table.
3) classer les enregistrement par ordre décroissant des scores.
4) Transférer les X candidats vers une table temporaire en affectant la nouvelle planète d'arrivée.
Le problème est bien dans le concret sous MYSQL pour transférer les enregistrements et pour les UPdatés... Comment transférer des enregistrements d'un rang à un autre (ex: du 3eme au 6eme)
Comment changer(update?) le champ planete avec la nouvelle planete (update select ne fonctionne pas)...
Je vous met mon code au cas où quelques passionnées s'intéresse au pb.
//on efface l'ancienne table si elle existe et on crée la nouvelle
$requete="DROP TABLE IF EXISTS TABLETRANSFERTGALAXIE";
$resultat=mysql_query($requete) or die(mysql_error());
//---CREE la nouvelle table HISTORIQUE pour les scores de GALAXIE
$requete="CREATE TABLE IF NOT EXISTS TABLETRANSFERTGALAXIE select pseudo,scoreplanete,planete,bestplanete from statsjoueurs2 where 1=0";
$resultat=mysql_query($requete) or die(mysql_error());
//pour chaque planete en partant de la terre, on classe et on compte le nombre de partants, de restants et de reculants
$rq="select nomplanete from listeplanetes";
$resultat=mysql_query($rq) or die(mysql_error());
while ($donnees = mysql_fetch_array($resultat))
{
//selectionne tous les enregistrements d'UNE planete
$planete=$donnees['nomplanete'];
$rq="select count(*) as nombresurplanete from statsjoueurs2 where planete='$planete'";
$resultatplanete=mysql_query($rq) or die(mysql_error());
$donneesplanete = mysql_fetch_array($resultatplanete);
//calcule le nombre de candidats au transfert sur une planete
$nbcandidats=$donneesplanete['nombresurplanete'];
//calcule le nombre de candidats qui montent , restent ou descendent sur les planetes.
$nbUP=round($nbcandidats/3);
$nbSTAY=round($nbcandidats/3);
$nbDOWN=$nbcandidats-$nbSTAY-$nbUP;
echo $nbUP."..".$nbSTAY."..".$nbDOWN."<br/>";
//calcule le rang des enregistrements à aller chercher dans la table (ATTENTION: enregistrements CLASSES en ordre DECROISSANT DE SCORE PLANETE)
$rangUP=$nbUP-1;
$rangSTAY=$rangUP+$nbSTAY;
//-------transfert des candidats vers la table
//on selectionne les candidats de cette planete qui vont avancer
$rq="select pseudo,scoreplanete,planete,bestplanete from statsjoueurs2 where planete='$planete' ORDER BY scoreplanete DESC limit 0,".$nbUP;
$resultattransfert=mysql_query($rq) or die(mysql_error());
while ($donneestransfert = mysql_fetch_array($resultattransfert))
{
$pseudojoueur=$donneestransfert['pseudo'];
$score=$donneestransfert['scoreplanete'];
$rq="insert into statsjoueurs2(pseudo,scoreplanete,planete) values('$pseudojoueur','$score,'uranus')";
$transfert=mysql_query($rq) or die(mysql_error());
}
}
Code : Tout sélectionner
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `questar`
--
-- --------------------------------------------------------
--
-- Structure de la table `statsjoueurs2`
--
CREATE TABLE `statsjoueurs2` (
`pseudo` varchar(12) NOT NULL,
`departement` varchar(2) NOT NULL,
`region` varchar(30) NOT NULL,
`scoremois` mediumint(9) NOT NULL,
`scoreannee` mediumint(8) unsigned NOT NULL,
`scoremoispourcent` float(3,1) unsigned NOT NULL,
`bestscoremois` mediumint(8) unsigned NOT NULL,
`bestscoremoispourcent` tinyint(3) unsigned NOT NULL,
`planete` varchar(8) NOT NULL,
`scoreplanete` mediumint(9) NOT NULL,
`bestplanete` varchar(8) NOT NULL,
`nbqcmfaitmois` smallint(4) unsigned NOT NULL,
`nbqcmfaitannee` smallint(5) unsigned NOT NULL,
`nbqcmever` mediumint(8) unsigned NOT NULL,
`nbquestionsmois` tinyint(9) NOT NULL,
`nbquestionsannee` mediumint(9) NOT NULL,
`nbquestionsever` mediumint(9) NOT NULL,
`nbquestionsjustesmois` mediumint(9) NOT NULL,
`passachetemois` tinyint(3) unsigned NOT NULL,
`passacheteever` tinyint(3) unsigned NOT NULL,
`visaachetemois` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`pseudo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `statsjoueurs2`
--
INSERT INTO `statsjoueurs2` (`pseudo`, `departement`, `region`, `scoremois`, `scoreannee`, `scoremoispourcent`, `bestscoremois`, `bestscoremoispourcent`, `planete`, `scoreplanete`, `bestplanete`, `nbqcmfaitmois`, `nbqcmfaitannee`, `nbqcmever`, `nbquestionsmois`, `nbquestionsannee`, `nbquestionsever`, `nbquestionsjustesmois`, `passachetemois`, `passacheteever`, `visaachetemois`) VALUES
('A1', '', '', 55, 0, 0.0, 0, 0, 'terre', 100000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A2', '', '', 55, 0, 0.0, 0, 0, 'terre', 200000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A3', '', '', 55, 0, 0.0, 0, 0, 'terre', 300000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A4', '', '', 55, 0, 0.0, 0, 0, 'terre', 400000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A5', '', '', 55, 0, 0.0, 0, 0, 'terre', 500000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A6', '', '', 0, 0, 0.0, 0, 0, 'terre', 600000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A7', '', '', 0, 0, 0.0, 0, 0, 'terre', 700000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('A8', '', '', 0, 0, 0.0, 0, 0, 'terre', 800000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('B1', '', '', 0, 0, 0.0, 0, 0, 'mars', 100000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('B2', '', '', 0, 0, 0.0, 0, 0, 'mars', 200000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('B3', '', '', 0, 0, 0.0, 0, 0, 'mars', 300000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('B4', '', '', 0, 0, 0.0, 0, 0, 'mars', 400000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('B5', '', '', 0, 0, 0.0, 0, 0, 'mars', 500000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('C1', '', '', 0, 0, 0.0, 0, 0, 'jupiter', 100000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('C2', '', '', 0, 0, 0.0, 0, 0, 'jupiter', 200000, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
('essai', '', '', 0, 0, 0.0, 0, 0, 'uranus', 666, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
--
-- Structure de la table `listeplanetes`
--
CREATE TABLE `listeplanetes` (
`idplanete` tinyint(3) unsigned NOT NULL auto_increment,
`nomplanete` varchar(10) NOT NULL,
PRIMARY KEY (`idplanete`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
--
-- Contenu de la table `listeplanetes`
--
INSERT INTO `listeplanetes` (`idplanete`, `nomplanete`) VALUES
(1, 'terre'),
(2, 'mars'),
(3, 'jupiter'),
(4, 'saturne'),
(5, 'uranus'),
(6, 'neptune'),
(7, 'pluton');