requête découpé en plusieurs bouts

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : requête découpé en plusieurs bouts

par Snipy » 05 déc. 2007, 11:21

Ah oui c'était en effet ma première idée de départ (quand je parlais dans une boucle).
Mais bon étant donné que j'aimerais l'afficher au dessus :?

Bon dans ce cas je vais faire une seconde requete avec uniquement un COUNT pour celle ci

Merci de m'avoir aidé ;)

Bonne journée

par Patriboom » 05 déc. 2007, 05:41

C'est assez simple, puisque tu count ramasse tout dans des paquets, tu ne peux pas faire ce que tu veux. Alors, il faut se rabattre sur un moindre mal et accepter que tes résultats (décomptes) soient obtenus après coup. Voici ce que tu pourrais faire:
$Combien = array();

$sql = 'SELECT nom, prenom, age, taille, salaire, tir, 3points, dribble, passe, rebond, contre, interception 
FROM joueurs INNER JOIN transferts ON joueurs.id = transferts.id_joueur
WHERE date_fin >='.time().'';
$resultat = mysql_query($sql)

WHILE ($Contenu = mysql_fetch_object($resultat)) {
     (ici, ton traitement d'affichage, tes autres opérations et vérifications ... )
     $Combien[$Contenu->id_joueur] = $Combien[$Contenu->id_joueur] + 1;

}

par Snipy » 04 déc. 2007, 22:12

2 ) une requête déployée par laquelle tu colliges les informations en cours de lecture.
Peux tu détailler s'il te plait ? :)

par Patriboom » 04 déc. 2007, 19:56

Puisqu'il est impossible d'avoir à la fois un résultat agrégé et le même résultat déployé, tu as deux choix:
1 ) une requête pour pour le résultat agrégé, l'autre pour le déployé
2 ) une requête déployée par laquelle tu colliges les informations en cours de lecture.

Vois aussi s'il ne te serait pas plus avantageux de diviser tes champs en deux tables et si c'est le cas, des les exploiter différemment, avec un JOIN ON , par exemple. Il est souvent beaucoup plus polyvalente d'avoir des petites tables contenants des renseignements très pointus, lesquelles tables tu peux lier ou non selon le besoin, que de grosses tables omniscientes.

par Snipy » 04 déc. 2007, 18:30

tu ne peux pas faire un COUNT et ramener les infos concernant chaque joueur en même temps car COUNT est une fonction d'AGGREGAT.
c'est bien ce que je pensais :(
En revanche, tu peux comptabiliser les données lues en PHP (dans ta boucle de lecture si c'est le cas)
Je pensais à ça aussi, mais j'aurais besoin de savoir le nombre avant de lancer ma boucle :roll:
même récupérer directement le nombre d'occurence de ton tableau de données si tu récupères tout d'un coup, tu fais un COUNT mais sur le tableau.
c'est à dire ?


Merci de ta réponse :)

par Sedril » 04 déc. 2007, 12:44

salut,

tu ne peux pas faire un COUNT et ramener les infos concernant chaque joueur en même temps car COUNT est une fonction d'AGGREGAT.

En revanche, tu peux comptabiliser les données lues en PHP (dans ta boucle de lecture si c'est le cas) ou même récupérer directement le nombre d'occurence de ton tableau de données si tu récupères tout d'un coup, tu fais un COUNT mais sur le tableau.

par Snipy » 03 déc. 2007, 14:31

en effet j'avais pas vu l'espace manquant...
Merci !

Concernant le champ date j'ai pris l'habitude d'utiliser le timestamp que je rentre dans un champ INT...

Mauvaise habitude, faudrait que je vois comment utiliser et quelle est l'interet de mettre ceci dans un champ date afin que par la suite je me mette à l'utiliser :p

EDIT j'aimerais compter le nombre d'entrée en même temps que ma requete j'avais pensée à ça ..
$sql = 'SELECT COUNT(joueurs.id) AS nombre_joueurs DISTINCT joueurs.id AS id_joueur, nom, prenom, age, taille, salaire, tir, 3points, dribble, passe, rebond, contre, interception 
FROM joueurs INNER JOIN transferts ON joueurs.id = transferts.id_joueur
WHERE date_fin >='.time().'';
Mais bon c'est pas le bon procédé

par albat » 03 déc. 2007, 14:13

Pourquoi avoir créé tes champs dates avec un type numérique et non date ? :shock:

En outre, tu as un bug de concaténation : une espace serait bienvenue :

Code : Tout sélectionner

WHERE date_fin >=1196683243AND age >=17

requête découpé en plusieurs bouts

par Snipy » 03 déc. 2007, 14:09

Hello tout le monde en ce lundi,
Me revoici avec un petit soucis.

Voici avant tout mon code :
if($_POST['rechercher'])
{
$sql = 'SELECT DISTINCT id, nom, prenom, age, taille, salaire, tir, 3points, dribble, passe, rebond, contre, interception 
FROM joueurs INNER JOIN transferts ON joueurs.id = transferts.id_joueur
WHERE date_fin >='.time().'';



if($_POST['age_mini'] && is_numeric($_POST['age_mini']))
{
$sql.= 'AND age >='.$_POST['age_mini'].''; 
}
if($_POST['age_max'] && is_numeric($_POST['age_mini']))
{
$sql.= ' AND age <='.$_POST['age_max'].''; 
}

if($_POST['skill_mini'] && is_numeric($_POST['skill_mini']))
{
$sql.= ' AND age >='.$_POST['skill_mini'].''; 
}

if($_POST['skill_max'] && is_numeric($_POST['age_max']))
{
$sql.= ' AND age <='.$_POST['skill_max'].''; 
}

if($_POST['prix_mini'] && is_numeric($_POST['prix_mini']))
{
$sql.= ' AND prix >='.$_POST['prix_mini'].''; 
}

if($_POST['prix_max'] && is_numeric($_POST['prix_max']))
{
$sql.= ' AND prix <='.$_POST['prix_max'].''; 
}

if($_POST['taille_mini'] && is_numeric($_POST['taille_mini']))
{
$sql.= ' AND taille >='.$_POST['taille_mini'].''; 
}

if($_POST['taille_max'] && is_numeric($_POST['taille_max']))
{
$sql.= ' AND taille <='.$_POST['taille_max'].''; 
}

echo $sql.'<br />';
$requete = mysql_query($sql) or die (mysql_error()) ;

}



echo $sql.'<br />';
$requete = mysql_query($sql) or die (mysql_error()) ;
Voici ma requete affichée ainsi que l'erreur.:
SELECT DISTINCT id, nom, prenom, age, taille, salaire, tir, 3points, dribble, passe, rebond, contre, interception FROM joueurs INNER JOIN transferts ON joueurs.id = transferts.id_joueur WHERE date_fin >=1196683243AND age >=17 AND age <=39 AND taille >=150 AND taille <=240

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 'age >=17 AND age <=39 AND taille >=150 AND taille <=240' at line
A mon avis je place mal mes apostrophes mais après plusieurs tentatives je n'arrive pas à résoudre le problème...

Code : Tout sélectionner

-- -- Structure de la table `transferts` -- CREATE TABLE `transferts` ( `id` int(11) NOT NULL auto_increment, `id_joueur` int(11) NOT NULL, `id_equipe_v` int(11) NOT NULL, `id_equipe_a` int(11) NOT NULL, `date_debut` int(11) NOT NULL, `date_fin` int(11) NOT NULL, `prix` int(11) NOT NULL, UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=3 ; -- -- Structure de la table `joueurs` -- CREATE TABLE `joueurs` ( `id` int(11) NOT NULL auto_increment, `id_equipe` int(11) NOT NULL, `nom` varchar(255) collate latin1_german2_ci NOT NULL, `prenom` varchar(255) collate latin1_german2_ci NOT NULL, `nationalite` varchar(255) collate latin1_german2_ci NOT NULL, `age` tinyint(4) NOT NULL, `taille` smallint(6) NOT NULL, `salaire` int(11) NOT NULL, `specialite` varchar(255) collate latin1_german2_ci NOT NULL, `temperament` varchar(255) collate latin1_german2_ci NOT NULL, `agressivite` varchar(255) collate latin1_german2_ci NOT NULL, `tir` smallint(6) NOT NULL, `3points` smallint(11) NOT NULL, `dribble` smallint(6) NOT NULL, `passe` smallint(6) NOT NULL, `rebond` smallint(6) NOT NULL, `contre` smallint(6) NOT NULL, `interception` smallint(6) NOT NULL, `fatigue` smallint(11) NOT NULL default '0', UNIQUE KEY `id_2` (`id`), UNIQUE KEY `id_3` (`id`), KEY `id` (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=351 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=351 ;
Merci d'avance :)

ps : je n'étais aps sur de devoir mettre le sujet ici ou dans php