Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2006, 22h36   #1
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 836
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 : 836
Points : 712
Points : 712
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
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h01   #2
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
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 !

DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h06   #3
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
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
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h28   #4
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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 :
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
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h33   #5
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Et oui je suis trop habitué à Mysql :/ C'est bien le genre de règle auquel je ne ferai qu'en souffrant.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h41   #6
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h44   #7
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Mysql c'est un peu comme PHP on peut faire un tas de truc qui ne ressemble à rien sans même sans rendre compte
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 00h12   #8
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
@Elwyn :

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

Code :
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
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 11h42   #9
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 836
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 : 836
Points : 712
Points : 712
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 :
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 :
$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
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 12h51   #10
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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 :
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 :
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 :
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
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 13h14   #11
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 836
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 : 836
Points : 712
Points : 712
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 )
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 15h38   #12
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 16h24   #13
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 836
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 : 836
Points : 712
Points : 712
Merci encore ! Je viens de me rendre compte que j'utilisais que 5% de tout Mysql ...

Je peux faire ca :

Code :
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 ?
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 17h26   #14
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 19h49   #15
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 836
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 : 836
Points : 712
Points : 712
Ouai mais non je vais pas pousser c'est juste un script banal
Merci pour tout ! A bientot
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h20.


 
 
 
 
Partenaires

Hébergement Web