IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQL] Encore mes kms !


Sujet :

PHP & Base de données

  1. #1
    Membre émérite Avatar de fallais
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 858
    Par défaut [SQL] Encore mes kms !
    Voila je reviens avec mon script de gestion de mes kms parcourus (ACC )
    Voila un bout de ma table simplifiée :

    id kms circonstance
    1 12 Nuit
    2 15
    3 15 Brouillard
    4 15 Neige

    J'aimerai le total des kilometres en fonction des criconstances sachant QUE un champ circonstance vide equivaut a Beau Temps, ET neige, brouillard,... equivaut a Mauvais Temps, et nuit ben ... a Nuit lol

    J'imagine qu'il va falloir utiliser SUM SELECT et GROUP BY mais la je bute sur la requete (et ca me prend la tete )

    La page est visible ici

    Merci de m'aider

  2. #2
    Membre chevronné
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Par défaut
    Salut !

    A défaut de savoir le faire dans une requête SQL je le ferai dans une procédure stockée avec des IF en fait. Mais je pense qu'il doit exister une solution avec des CASE dans le SELECT. Mais je n'ai jamais effectué ce genre de requêtes.
    La vitesse de la lumière étant supérieure à la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parlé
    -----------------------------------------------------------
    Retrouvez mes articles informatique sur mon Site Developpez.
    Le reste, sur le Site perso !


  3. #3
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Citation Envoyé par dbprog
    Salut !

    A défaut de savoir le faire dans une requête SQL je le ferai dans une procédure stockée avec des IF en fait. Mais je pense qu'il doit exister une solution avec des CASE dans le SELECT. Mais je n'ai jamais effectué ce genre de requêtes.
    ???? cad


    La solution simple,
    SELECT SUM(kms) as Km FROM tatable GOUP BY circonstance

    Je ne l'ai pas testé mais bon se devrait être sa.

    Après pour faire les équivalence texte d'IHM <-> texte en base, fais le en php.
    Le texte d'IHM n'à a priori pas à être géré au niveau du sgbd dans cette exemple.

    ----------------------- édit
    Au fais pourquoi beau temps ne s'appelle pas beau temps dans la table ?
    Tant que j'y suis pourquoi ne pas avoir créé une table de circonstances ?

    bbye

  4. #4
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Citation Envoyé par ePoX
    SELECT SUM(kms) as Km FROM tatable GOUP BY circonstance

    Je ne l'ai pas testé mais bon se devrait être sa.
    Pas tout à fait. Les colonnes spécifiées dans le GROUP BY doivent être reprises dans le SELECT (eh oui sinon on ne sait pas à quel groupe appartient la somme).

    Ceci serait encore mieux vu les données contenues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IFNULL(circonstance, 'Beau temps'), SUM(kms) as Km FROM tatable GOUP BY circonstance
    Citation Envoyé par ePoX
    Au fais pourquoi beau temps ne s'appelle pas beau temps dans la table ?
    Tant que j'y suis pourquoi ne pas avoir créé une table de circonstances ?
    Bonnes questions ça

  5. #5
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Et oui je suis trop habitué à Mysql :/ C'est bien le genre de règle auquel je ne ferai qu'en souffrant.

  6. #6
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Ah ben... j'ai tellement souffert avec d'autres SGBD que je n'ai jamais remarqué que MySQL permettait cela

    Comme quoi, il vaut mieux prendre directement les bonnes habitudes

  7. #7
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Mysql c'est un peu comme PHP on peut faire un tas de truc qui ne ressemble à rien sans même sans rendre compte

  8. #8
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    @Elwyn :

    Je pense que cette requête te plaira, même si le cas du NULL la rend assez crade

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t.temps, SUM(t.total_tmp) as total_km
    FROM (
    	SELECT 	CASE circonstance 
    		WHEN 'Nuit' THEN 'Nuit'
    		ELSE IF(circonstance IS NULL, 'Beau Temps', 'Mauvais Temps')
    		END AS temps, SUM(kms) AS total_tmp
    	FROM tatable r
    	GROUP BY circonstance
    ) t
    GROUP BY temps

  9. #9
    Membre émérite Avatar de fallais
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 858
    Par défaut
    Tout d'abord merci de toutes ces reponses ca fait plaisir de se lever et de voir qu'on a pensé a nous Je me suis trompé, le champ qui contient la météo c'est remarques

    Biglo je ne comprend pas ta requete car certains nom de variables dedans ne sont pas dans ma table (ex : t.temps, ...)

    Voici ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `conduite` (
      `id` int(5) NOT NULL auto_increment,
      `date` varchar(10) collate latin1_general_ci NOT NULL,
      `tps` int(5) NOT NULL,
      `kms` int(5) NOT NULL,
      `voiture` varchar(5) collate latin1_general_ci NOT NULL,
      `circonstances` varchar(50) collate latin1_general_ci NOT NULL,
      `remarques` varchar(50) collate latin1_general_ci NOT NULL,
      `type_route` varchar(5) collate latin1_general_ci NOT NULL,
      PRIMARY KEY  (`id`)
    )
    En fait si vous avez vu ma page, vous avez du voir que j'ai fait un total des kms en fonction de la voiture (M pour Mondeo et F pour Fiesta) afin de savoir combien j'ai parcouru avec chauque voiture ; la requete etait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $total_kms_par_voiture = mysql_query("SELECT voiture, SUM(kms) AS total_kms FROM conduite GROUP BY voiture");
    Un array pour transformer M et F en Mondeo et Fiesta et le tour est joué.

    Mais je reviens aujourd'hui pour autre chose, vous avez compris mon probleme, mais pour repondre aux questions : si remarques est vide, ca signifi R.A.S (je vais pas a chaque fois marquer Beau Temps ... ) et donc Beau Temps. Je veux donc savoir combien de kilometres j'ai parcouru par : Beau temps, Mauvais Temps et Nuit

    Sachant que :
    Beau Temps = Champ remarques vide
    Nuit = Nuit dans champ remarques
    Mauvais Temps = Neige ou Pluie ou Brouillard dans remarques

    Voila en esperant vous avoir clairement expliqué mon probleme.

    PS : Dsl Biglo si ta requete etait bonne mais je l'ai pas comprise Mais il me faut aussi le code de la while car la je sais pas comment exploiter ce qui sort, d'ailleur je sais meme pas ce qui sort

  10. #10
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Première remarque, quand tu disais "un champ circonstance vide equivaut a Beau Temps", je pensais que ça voulait dire que ce champ était à NULL. Apparemment, tu voulais dire que c'était une chaîne vide. Il va donc falloir modifier un peu la requête que je t'ai donnée.

    Pour ma requête, t.temps et t.total_tmp ne sont pas dans ta table et c'est normal. Ce sont des alias créés dans le deuxième SELECT.

    La requête fonctionne ainsi :

    Le SELECT imbriqué va "renommer" la condition météo : brouillard -> mauvais temps, nuit -> nuit, NULL -> beau temps. Et en plus de cela, il va calculer la somme de kms pour chaque circonstance entrée. Donc il va calculer le nombre de kms parcourus dans le brouillard, dans la nuit, etc.

    Avec ton exemple, il renvoie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    temps total_tmp
    Nuit 12
    Beau temps 15
    Mauvais temps 15
    Mauvais temps 15
    Le SELECT principal récupère ce résultat et va regrouper tous les mauvais temps ensemble (c'est-à-dire tous les anciens pluie, brouillard, déluge, tsunami, ... ). Et donnera donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    temps total_kms
    Nuit 12
    Beau temps 15
    Mauvais temps 30
    Le résultat se récupère comme d'habitude avec un mysql_fetch_xxx et si tu utilises un tableau associatif, tu pourras y accéder avec $row['temps'] et $row['total_km'].

    La requête remaniée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t.temps, SUM(t.total_tmp) as total_km
    FROM (
    	SELECT CASE remarques
    		WHEN 'Nuit' THEN 'Nuit'
    		WHEN '' THEN 'Beau temps'  
    		ELSE 'Mauvais Temps'
    		END AS temps, SUM(kms) AS total_tmp
    	FROM conduite c
    	GROUP BY remarques
    ) t
    GROUP BY temps
    Essaie-la dans PHPMyAdmin par exemple. Fais d'abord le 2ème SELECT tout seul (celui qui est dans le FROM) pour voir ce qu'il fait comme opération. Puis exécute la requête entière. Si tu as des questions après cela, redemande

  11. #11
    Membre émérite Avatar de fallais
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 858
    Par défaut
    Alors la bravo et merci !
    Par contre, il y a encore un petit probleme
    Si rien => Beau Temps
    Si nuit => Nuit
    Sinon => Mauvais Temps

    Or dans la case remarques il peut y avoir : bouchons,problemes,... qui ne sont pas du mauvais temps (donc j'imagine que le si pratique else va devoir etre changé )

    Tu peux voir ma page ici : http://francallais.free.fr/conduite.php pour te rendre compte

    Et mauvais temps peut etre du a : Pluie,Grele,Brouillard,Neige (c'est pas trop j'espere )

  12. #12
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    En effet, j'ai supposé qu'il y avait toujours des remarques sur le climat. Il te faudra donc d'autres conditions dans le CASE.

    Ce qui m'étonne par contre, c'est que tu ne peux pas avoir "bouchons + pluie" (par exemple) ? Enfin bon, c'est toi qui sais ce dont tu as besoin dans ta base.

  13. #13
    Membre émérite Avatar de fallais
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 858
    Par défaut
    Merci encore ! Je viens de me rendre compte que j'utilisais que 5% de tout Mysql ...

    Je peux faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT t.temps, SUM(t.total_tmp) as total_km
    FROM (
    	SELECT CASE remarques
    		WHEN 'Nuit' THEN 'Nuit'
    		WHEN '' THEN 'Beau temps'  
    		WHEN 'Pluie' OR WHEN 'Brouillard' OR WHEN 'Neige' THEN 'Mauvais temps'
    		ELSE 'Mauvais Temps'
    		END AS temps, SUM(kms) AS total_tmp
    	FROM conduite c
    	GROUP BY remarques
    ) t
    GROUP BY temps
    ?

    PS : Et si il y a bouchons + pluie je fais comment ?

  14. #14
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Tu peux faire ça mais tu auras toujours "Mauvais temps" pour bouchons et autres

    Citation Envoyé par Elwyn
    PS : Et si il y a bouchons + pluie je fais comment ?
    C'est ce que je me demandais. Ta base n'est pas construite pour gérer ce genre de cas. Pourquoi ne pas mettre dans conduite une colonne condition_climatique, un booléen jour/nuit, et une colonne remarque ? Après c'est sûr que ça complique les requêtes, mais tu peux faire ce que tu veux, comme par exemple un bouchon la nuit avec une tempête de neige

  15. #15
    Membre émérite Avatar de fallais
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 858
    Par défaut
    Ouai mais non je vais pas pousser c'est juste un script banal
    Merci pour tout ! A bientot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] encore les dates
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/12/2007, 14h54
  2. [SQL] Encore un probleme de date et heure !
    Par Maxi-môme dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 28/06/2007, 16h25
  3. [ORACLE-SQL]virer mes doublons
    Par gusrom86 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/05/2007, 09h59
  4. Code SQL de mes requêtes coupées par ACCESS 2003
    Par boubou_s dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/03/2007, 16h34
  5. sql encore et tjs... :o(
    Par exyacc dans le forum Bases de données
    Réponses: 18
    Dernier message: 14/09/2005, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo