JeuWeb - Crée ton jeu par navigateur
Problème avec une requete - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Problème avec une requete (/showthread.php?tid=1749)



Problème avec une requete - Seals - 12-09-2007

Bonjour,

j'ai un porblème avec une requète pourtant assez simple, la voici :
Code PHP :
<?php
else {

$requete = mysql_query("
SELECT c.nombre, m.COUNT(pseudo) AS classement
FROM combient c LEFT JOIN membres m
WHERE m.points>='"
. $start['points'] . "', m.inscription>='" . $start['inscription'] . "'");

$var = mysql_fetch_array($requete);

?>
<div id="separation_text">
<ul>
<li>
Connecté en tant que <?php echo $start['pseudo']; ?> -
Vos ressources : <?php echo $start['minerais']; ?> Minerais et <?php echo $start['pieces']; ?> Pièces -
Classement : <?php echo $var['classement']; ?> / <?php echo $var['nombre']; ?>.
</li>
</ul>
</div>
<?php
}
?>


La requète ne retourne aucune erreur, c'est simplement que $var['classement'] et $var['nombre'] ne contiennes rien.


Pour comprendre ce que j'ai voulut faire :
Je vais chercher le champ "nombre" de la table "combient" qui contien le nombre de joueurs (j'update le nombre à chaque inscription),
Ensuite je compte le nombre de d'entrées dans ma table membre dont le champ points et inscription (le timetamp) sont superieur au nombre de points et à la date d'inscription du membre.



Merci d'avance si quelqu'un peu m'aider à résoudre ce problème.


RE: Problème avec une requete - NicoMSEvent - 12-09-2007

il me semble qu'il y a des problemes de syntaxe...

essaye de réécrire ta requete avec cette syntaxe :
Code :
SELECT ... FROM table1
LEFT JOIN table2 ON (condition de jointure)
WHERE ...



RE: Problème avec une requete - Seals - 12-09-2007

Je viens d'essayer, toujours le même problème.

Je pense que je vais être obliger de faires 2 requètes :

Code PHP :
<?php 
$requete1
= mysql_query("
SELECT COUNT(pseudo) AS classement
FROM membres WHERE points>='"
. $start['points'] . "', inscription>='" . $start['inscriprion'] . "'");
$result1 = mysql_fetch_array($requete1);

$requete2 = mysql_query("
SELECT nombre
FROM combient"
);
$result2 = mysql_fetch_array($requete2);

:pleure2:


RE: Problème avec une requete - NicoMSEvent - 12-09-2007

je n'arrive pas a comprendre la structure de ta base de données, ni vraiment ce que tu compte en sortir... pourrais-tu détailler un peu plus?

(une question claire entraine une réponse claire ^^)

Edit : pour savoir combien de personnes tu as dans la base de données, il suffit de faire un SELECT count(*) from membre
Il vaut mieux éviter les champs qui sont une valeur calculée...
et puis ce n'est pas parce que ta requete ne tombe pas en erreur qu'elle est bonne pour autant...
Entre 2 arguments d'un WHERE, on trouve généralement un AND ou un OR, pas une virgule...


RE: Problème avec une requete - Seals - 12-09-2007

NicoMSEvent a écrit :il suffit de faire un SELECT count(*) from membre

Justement non, car je ne vois pas comment compter le nombre de joueurs qui on un nombre de point supperieur au membre, et à la fois compter le nombre d'entrée dans la table, en une seul requète. :heuuu:

C'est pour ça que j'ai créee une autre table avec un champ et une seul entrée qui contien le nombre de joueur.


Citation :je n'arrive pas a comprendre la structure de ta base de données, ni vraiment ce que tu compte en sortir... pourrais-tu détailler un peu plus?

Ok je réexplique ^^

Déjà, je veux compter le nombre d'entrée de la table membres qui ont un nombre de point suppérieur à $start['points'] (qui contien le nombre de point du joueur) pour connaitre le classement du joueur.

Ensuite je veux selectionner le champ nombre dans la table combient, qui contien le nombre de joueurs inscrit.


Pour avoir par exemple ceci :
Votre classement : 3 / 1200


ma table membre se présente comme ça :
id / pseudo / points (il y a d'avantage de champs mais se sont les seuls qui nous interessent

et la table combient :
nombre /
avec une seul entrée qui contien le nombre de joueur.


RE: Problème avec une requete - NicoMSEvent - 12-09-2007

ceci ne se sert que de la table membre... c'est un peu tricher vu que je me sert de select imbriqués (fonctionne a partir de MySQL 4.1, donc si tu as un tout vieux serveur ça risque de ne pas fonctionner)
Code :
$requete = mysql_query("SELECT
COUNT(SELECT * FROM membre WHERE point>'".$start['points']."') classement,
COUNT(SELECT * FROM membre) nombre
FROM DUAL;
");

et si tu ne connais que l'identifiant de ton perso et pas ses points, tu pourrais même faire ceci (ça t'éviterait encore une requete), surtout si les points risquent de changer régulierement, même une fois connecté...:
Code :
$requete = mysql_query("SELECT
COUNT(SELECT * FROM membre m_autres,membre m_moi WHERE m_autres.point>m_moi.point AND m_moi.id='".$mon_id."') classement,
COUNT(SELECT * FROM membre) nombre
FROM DUAL;
");



RE: Problème avec une requete - Seals - 12-09-2007

Merci,

le problème c'est que j'avais déjà songé aux requètes embriqués, et ce qui ne vas pas, c'est que ça ne compte pas comme une seul requète mais chaque SELECT compte pour une requète.

Et comme je suis limité par mon hebergeur pour le nombre de requètes par jours, c'est pour ça que j'essayais de n'en faire qu'une au lieux des deux que j'ai posté plus haut.


Mais bon, là je pense que je n'ai aps le choix donc ... je vais laisser deux requètes ^_^


RE: Problème avec une requete - Kalan - 18-09-2007

Lors de l'utilisation d'une fonction d'aggrégation (MAX, COUNT, SUM etc...) dans une reqête ramenant d'autres colonnes "unitaires", il est nécessaire (en SQL standard donc sans doute aussi avec MySQL) de préciser quelles sont les colonnes de regroupement.

Dans ton cas, la requête suivante devrait fonctionner (j'espère) :

SELECT c.nombre, COUNT(m.pseudo) AS classement
FROM combient c LEFT JOIN membres m ON condition de jointure
WHERE m.points>='" . $start['points'] . "', m.inscription>='" . $start['inscription'] . " GROUP BY nombre"


(et sans doute faut-il aussi ajouter la condition de jointure dans ton LEFT sans quoi ca risque de pas passer).