Page 1 sur 1

Ma position dans un classement...

Posté : 24 mai 2012, 00:57
par Tanker_
Salut à tous,
alors j'ai un problème qui relève pour moi de l'impossible mais je suis sûr que vous pourrez m'aider à trouver une solution.
Je créé un site ou il y a un système de vote par photos.
Jusque là, rien de très exceptionnel.

Mais voilà, il y a un espace membre et le but du site est de récolter le max de j'aime sur ses photos.
Mais alors voilà, j'ai codé moi même 50% du site, et utilisé donc quelques modules comme celui des "pouces verts" que je trouvait très complet.

Le truc c'est que je me retrouve avec 3 tables clefs sur ma BDD.
(j'ai barré les champs inutiles)
membres (ou les membres sont répertoriés)
Image

catalogue
là ou sont répertoriés les photos
Image

et enfin, celle ou sont répertoriés les votes. en effet, ça aurait été plus simple d'avoir les votes sur la table catalogue
donc ici, on a thumbsup_items
Image

donc concrètement, quand on vote pour une photo, une entrée s'insère dans thumbsup_items, donc un "item" s'ajoute et est modifié à chaque vote posifif ou négatif.

le champs name de thumbsup_items et author_id de catalogue doivent coordonner avec id de membres afin que les tables soient liées entre elle. Bref tout va bien.

Là j'ai voulu m'attaquer au classement. Voici mon code.

Code : Tout sélectionner

<?php //Membre $informationsMembre = 'SELECT * FROM membres WHERE login="'.mysql_escape_string($_SESSION['login']).'"'; $donnees = mysql_query($informationsMembre) or die('Erreur SQL !<br />'.$informationsMembre.'<br />'.mysql_error()); $data1 = mysql_fetch_array($donnees); //Catalogue $informationsCata = 'SELECT * FROM catalogue WHERE author_id="'.mysql_escape_string($data1['id']).'"'; $donnees1 = mysql_query($informationsCata) or die('Erreur SQL !<br />'.$informationsCata.'<br />'.mysql_error()); $dataCata = mysql_fetch_array($donnees1); //Items $informationsTh = 'SELECT * FROM thumbsup_items ORDER BY (votes_down - votes_up) LIMIT 0,50'; $donnees2 = mysql_query($informationsTh) or die('Erreur SQL !<br />'.$informationsTh.'<br />'.mysql_error()); $i = 0; while($dataTh = mysql_fetch_array($donnees2)) { $i++; $votesTotal = $dataTh['votes_up'] - $dataTh['votes_down']; //Couleur des points if($votesTotal >= 0) { $color = '<font color="#58BF2C">'; } elseif($votesTotal < 0) { $color = '<font color="red">'; } //Classement général echo ' n°<b>'.$i.'</b> Membre numéro <a href="#" /><b>'.$dataTh['name'].'</b></a> avec <b>'.$color.$votesTotal.'</font></b> votes au total<br />'; } ?>
donc ça m'affiche ceci :
Image

notez que je dois mettre le numéro de membre car je n'ai pas d'information dans thumbsup_items concernant le pseudo !

Et donc là, le plus important: j'aimerai afficher ma position dans le classement.
Et je ne sais pas comment m'y prendre. >.<

j'ai testé ça :

Code : Tout sélectionner

<?php //Mon classement if($dataTh['name'] == $data1['id']) { echo 'C\'est moi'.$i; } ?>
mais ça m'a pas l'air d'être ça...

Pouvez vous m'aider, en prenant compte de l'organisation pourrie de ma BDD ? ca m'évitera de tout reprendre sur le site ^^
Merci d'avance !

Re: Ma position dans un classement...

Posté : 24 mai 2012, 09:17
par Mazarini
Pour récupérer des infos dans une autre table, il faut faire une jointure :
select nomcolonne,.. from table1,table2 where table1.id= table2.id

Pour ton problème, de ton classement, affiche les 2 variables sur chaque ligne pour voir ce quelles contiennent et pourquoi ton message ne s'affiche pas.

Re: Ma position dans un classement...

Posté : 24 mai 2012, 13:17
par Tanker_
Salut,
merci de ta réponse.
Pour être honnête, je ne connais pas trop la structure de ces requêtes..

Est ce que la syntaxe de celle ci est bonne ?

Code : Tout sélectionner

$requete = 'SELECT * from catalogue,thumbsup_items where catalogue.author_id= thumbsup_items.name';
Puis à quoi ça va me servir de faire ça ? J'aimerai afficher $i (ma position, donc), lorsque l'id de la base membres correspond à l'id de l'item de la base thumbsup_items.
Comment faire...je comprends pas trop là.

Re: Ma position dans un classement...

Posté : 24 mai 2012, 15:38
par Mazarini
Je pensais plus à un rapprochement avec la table members pour avoir le nom de la personne.
SELECT thumbsup_items.*, login FROM thumbsup_items, members ORDER BY (votes_down - votes_up) where members.id = thumbsup_items.id LIMIT 0,50
Pour trouver ton score, il suffit ensuite de comparer $dataTh['login'] et $_SESSION['login']


Edit : Eventuellement, il faudrait que tu expliques comment tes tables sont liés, ca n'a rien d'évident. En tout cas entre id (entier) et name (caractères) difficile de faire une liaison.
J'ai lié thumbsup_items et members sur une égalité de l'id (mais pas sur que ce soit bon).

Re: Ma position dans un classement...

Posté : 24 mai 2012, 17:27
par Tanker_
J'ai essayé mais malheureusement ça marche pas.
SELECT thumbsup_items.*, login FROM thumbsup_items, members ORDER BY (votes_down - votes_up) WHERE members.id = thumbsup_items.name LIMIT 0,50
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE members.id = thumbsup_items.name LIMIT 0,50' at line 1

En ce qui concerne les tables, members.id, thumbsup_items.name et catalogue.author_id sont reliés.

EDIT : J'ai modifié la requête de la sorte :
	$informationsTh = 'SELECT thumbsup_items.*, login FROM thumbsup_items, membres WHERE membres.id = thumbsup_items.name ORDER BY (votes_down - votes_up) LIMIT 0,50';
ca fonctionne...Mais quand j'affiche $dataTh['login'], ça m'affiche le membre n° 12, soit le dernier sur mon site.

Je comprends pas pourquoi, c'est censé m'afficher la liste.
n°1 Membre numéro henry avec 0 votes au total

Re: Ma position dans un classement...

Posté : 24 mai 2012, 17:50
par Mazarini
teste la requete avec phpmyadmin pour voir si le résultat est bon.
(désolé pour mon erreur de syntaxe)

Re: Ma position dans un classement...

Posté : 24 mai 2012, 17:52
par Tanker_
Ca m'affiche ça ! o_O
Image

EDIT : ce que je comprends pas, c'est qu'on demande que thumbsup_items.name = membres.id.
Mais membres.id, on le récup pas non ? on récup que login

Re: Ma position dans un classement...

Posté : 24 mai 2012, 18:03
par Mazarini
C'est que la condition WHERE membres.id = thumbsup_items.name n'est pas bonne.

Si tu parts d'une ligne de thumbsup_items, comment tu fais pour trouver le login en regardant le contenu des tables ?

Re: Ma position dans un classement...

Posté : 24 mai 2012, 18:04
par Tanker_
Ben justement, il faut associer thumbsup_items.name à membres.id pour trouver membres.login
Y'a pas moyen de trouver le pseudo directement de thumbsup_items

Re: Ma position dans un classement...

Posté : 24 mai 2012, 19:51
par Mazarini
un des problèmes est que name est du varchar et id de l'integer.
Eventuellement, essaye where membres.id = CAST(thumbsup_items.name AS UNSIGNED)

Re: Ma position dans un classement...

Posté : 24 mai 2012, 22:30
par Tanker_
J'ai changé name en varchar.
Et j'ai ajouté
where membres.id = CAST(thumbsup_items.name AS UNSIGNED)
.

Et rien ne change :(
je commence à désespérer...

Image

Re: Ma position dans un classement...

Posté : 25 mai 2012, 17:30
par Tanker_
Une idée ?

Re: Ma position dans un classement...

Posté : 25 mai 2012, 17:46
par Mazarini
qu'il y a qu'une ligne pour laquelle il y a égalité entre membres.id et thumbsup_items.name

Re: Ma position dans un classement...

Posté : 25 mai 2012, 19:18
par Tanker_
J'ai compris mon erreur...mais la requête ne m'avance pas à grand chose finalement...
$informationsTh = 'SELECT thumbsup_items.*,catalogue.id FROM thumbsup_items, catalogue WHERE catalogue.id = thumbsup_items.name ORDER BY (votes_down - votes_up) LIMIT 0,50'; 
En fait j'ai un problème car les 3 bases ne sont pas liées entre elles.
thumbsup_items.name = catalogue.id
et
catalogue.author_id = membres.id

Or, ici, je n'ai pas l'info du pseudo. Comment puis joindre 3 bases en même temps ? ou faire ça en 2 requêtes pour récupérer le pseudo ?

Re: Ma position dans un classement...

Posté : 27 mai 2012, 16:19
par Tanker_
Bon j'ai réussi après m'être bien creusé la tête!
comment je peux afficher la position de chaque membre maintenant, sachant que je trouve la position avec une simple variable $i qui s'incrémente à chaque fois que la boucle recommence..
Y'a rien dans la BDD!