Calculs sur requête ?

Eléphant du PHP | 79 Messages

24 oct. 2012, 08:39

Je me suis tapé la moitié de cette doc, ça ne m'a pas empéché de faire cette erreur de syntaxe et de me casser les dents dessus toute la nuit !
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Mammouth du PHP | 2278 Messages

24 oct. 2012, 10:13

C'est pas ça, mais je ne crois pas que les femmes soient assez intelligentes pour comprendre... Mais bon merci quand même pour l'intention Julietta
Moi, je suis du troisième sexe par conviction; mais si on comptait les étudiants que j'ai tirés des abîmes du fortran ou du C++, entre autres, caferait un nombre largement supérieur au QI d'Einstein, a fortiori du tien Aussi me demandé-je si je suis bien qualifié(e?) pour faire une suggestion ralentissante à un problème qui presse. Mais je considère comme un grossier défaut de débutant de placer tout ce qu'on veut demander dans le query:
 $res = mysql_query('SELECT `killed` AS name, COUNT `killed` * (CASE killed 
                                                    WHEN 12 THEN 10
                                                    WHEN 19 THEN 10 
                                                    WHEN 20 THEN 5) AS count
                                                FROM kills
                                                WHERE killed NOT IN (999,0,17)
                                                GROUP BY `killed`
                                                ORDER BY count DESC
                                                LIMIT 10');
			
			while($row = mysql_fetch_assoc($res)) { $rows[] = $row; }
au lieu de:
$requete = 'SELECT `killed` AS name, COUNT `killed` * (CASE killed  WHEN 12 THEN 10   WHEN 19 THEN 10    WHEN 20 THEN 5) AS count            FROM kills  WHERE killed NOT IN (999,0,17)  GROUP BY `killed` ORDER BY count DESC  LIMIT 10'); 
print "<br>$requete</br>";
$resultat =  mysql_query($requete);
if ($resultat !== false)
{

}
else
{

ce qui permet de faire un copier/coller d ela requete dans phpmyadmin ou semblable et de la modifier.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 79 Messages

24 oct. 2012, 10:34

Wow tu picoles ou quoi ? J'ai rien compris.
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Eléphant du PHP | 79 Messages

24 oct. 2012, 10:54

No way, je pige pas pourquoi il ne considère que les "999", qu'il multiplie par 10

Code : Tout sélectionner

public function getExp() { $res = mysql_query('SELECT killed_by_uuid AS name, (COUNT(killed) * ( CASE WHEN killed BETWEEN 1 AND 16 OR killed IN(18, 19) OR killed BETWEEN 21 AND 30 THEN 5 WHEN killed IN(20, 999) THEN 10 END ) ) AS count FROM kills WHERE killed_by = 999 AND killed <> 0 AND killed <> 17 GROUP BY `killed_by_uuid` ORDER BY count DESC LIMIT 10') or die(mysql_error()); while($row = mysql_fetch_assoc($res)) { $rows[] = $row; } return $rows; }
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Mammouth du PHP | 2278 Messages

24 oct. 2012, 13:04

Il faut apprendre à lire.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

24 oct. 2012, 14:35

Ouai mais c'est pas mon métier et ça me gonfle, donc file moi la solution...
- je connais des femmes bien plus intelligente que moi (toi je sais pas mais je pige rien en mirco biologie et autre truc du genre)
@+
Y'a pas besoin d'être intelligent pour se servir d'un aspirateur ou se mettre à quatre pattes \:D/

++ Joe

(joke)
Merci de ne pas troller et de respecter les membres du forum, les remarques sexistes sont a éviter.
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 2278 Messages

24 oct. 2012, 15:16

Comme je n'ai pas le temps de reconstituer ta bdd, (l faudrait pour cela en posséder un dump au format sql), je ne peux pas dire mieux que:
il est plus commode en général de procéder ainsi:
$requete = "Insert ...": // ou autre chose
$resultat = mysql_query($requete); // $resultat est un booleen
if ($resultat === false)
{
echo mysql_errno() . ": " . mysql_error() . "\n";
}
else
{
//traitement normal du résultat
}
en ajoutant si on ne comprend pas:
$requete = "Insert ...": // ou autre chose
print "<br>$requete<br>";
$resultat = mysql_query($requete); // $resultat est un booleen
if ($resultat === false)
{
echo mysql_errno() . ": " . mysql_error() . "\n";
}
else
{
//traitement normal du résultat
}
l'affichage de la requête permet souvent de mieux voir l'erreur que le message mysql :"syntax error near..." (certains messages d'erreur mysql n'aident en rien à résoudre le problème). Et on peut la copier et la coller dans la fenêtre SQL de phpMyadmin, ou directement en mode texte, et la modifier jusqu'à ce qu'on obtienne ce qu'on veut.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 79 Messages

24 oct. 2012, 18:31

Le problème c'est que ce débug n'apporte rien de plus.

Par contre j'aurais du poster ce screen de la table avant :

Image
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Eléphant du PHP | 79 Messages

24 oct. 2012, 20:37

Vous mangerez un autre jour, maintenant c'est l'heure de me répondre.
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Mammouth du PHP | 2278 Messages

24 oct. 2012, 21:03

Les MAngetout, c'est chez Albert Cohen.
Ta réponse semble signifier que ta requete fonctionne mais ne fait pas ce que tu veux.

Dans ces cas, je simplifie en testant à chaque fois une variante de plus.
C'est bien de montrer la structure. Si tu veux qu'on teste, fais une sauvegarde au format SQL (c'est qq part dans phpadfmin, mais, me servant de mysql en ligne de commande, je ne saurais en dire plus sur ce point.) Parce que, avec un lot de données correspondant aux tiennes, on peut essayer de comprendre.
Enfin, mais c'est par pure curiosité, ce sont des données de quoi? d'un jeu, je suppose...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 79 Messages

24 oct. 2012, 21:18

Tout semble être correct, sauf qu'il n'affiche que le

Code : Tout sélectionner

WHEN killed IN(999) THEN 10
         public function getExp() {
         $res = mysql_query('SELECT killed_by_uuid AS name,
                              (COUNT(killed) * (
                                 CASE
                                    WHEN killed BETWEEN 1 AND 16
                                       OR killed IN(18, 19)
                                       OR killed BETWEEN 21 AND 30
                                    THEN 5
                                    WHEN killed IN(20, 999) THEN 10
                                 END
                                 )
                              ) AS count
                           FROM kills
                           WHERE killed_by = 999
                              AND killed <> 0
                              AND killed <> 17
                                                GROUP BY `killed_by_uuid`
                                                ORDER BY count DESC
                                                LIMIT 10') or die(mysql_error());
         
         while($row = mysql_fetch_assoc($res)) { $rows[] = $row; }
       
         return $rows;
      }
L'avenir de la Terre dépend de ce problème, il faut que vous le résolviez.
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Mammouth du PHP | 2278 Messages

25 oct. 2012, 10:06

Ceci pour m'assurer que je comprends la requete
(COUNT(killed) * (
    CASE
      WHEN 
                 killed BETWEEN 1 AND 16
                 OR 
                 killed IN(18, 19)
                 OR 
                 killed BETWEEN 21 AND 30
      THEN 5 #killed peut valoir 1 à 16 ou 18 ou 19 ou 21 à 30 soit toute valeur entre 1 et 30 compris, sauf 17 et 20
       WHEN 
              killed IN(20, 999) #killed vaut 20 ou 999
       THEN 10
                                 END
                                 )
                              ) AS count
Moi je multiplierais par des nombres premiers entre eux pour tester et/ou je ferais une requete similaire sans la multiplication
Dans un cas pareil je bidulerais ainsi:
definir dans ma tete un killed_by et faire un bête
select * from kills  FROM kills WHERE killed_by = 999
Noter le resultat. Ajouter le comptage.... Ajouter la multiplication.
Analogue pour le Case
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 79 Messages

25 oct. 2012, 12:34

Après vérification, il tient compte de toutes les lignes, mais au lieu d'en multiplier certaines par 5 et d'autres par 10, il multiplie tout par 10.
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net

Mammouth du PHP | 2278 Messages

25 oct. 2012, 13:18

Si je vois bien,

11 killed by 999 valent 999 : soit 110 et 13 valent autre chose soit 65....

WHERE killed_by = 999
###AND killed <> 0
### AND killed <> 17 sont inutiles; mais je doute que ça résolve le problème
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 79 Messages

29 oct. 2012, 05:27

Encore un qui a fumé de l'herbe...
Mon site dédié à Minecraft : http://www.orminecraft.com
Et celui dédié à ses serveurs multijoueur ;) http://www.serveurs-minecraft.net