Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 13/07/2011, 12h44   #1
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
Par défaut un problème de sous-requête

Bonjour,
On y est mes premiers pas sur le forum !!
Je viens chercher de l'aide après de nombreuses recherches vaines et un mal de tête pas possible.
J'ai donc une requête avec une sous-requête :
Code :
1
2
3
4
5
6
SELECT com.nom_commune, 
SEC_TO_TIME(SUM((SELECT TIME_TO_SEC(inter.tps_activite) FROM atl_intervention inter WHERE inter.atl_activite_id_activite=1))) AS surveillance, SEC_TO_TIME(SUM((SELECT TIME_TO_SEC(inter.tps_activite) FROM atl_intervention inter WHERE inter.atl_activite_id_activite=10))) AS antiadulte
FROM atl_intervention inter, atl_commune com
WHERE inter.atl_commune_id_commune = com.id_commune
AND inter.date_intervention <= '2011-06-30' AND inter.date_intervention >='2011-06-01' AND com.code_dep = '17'
GROUP BY com.id_commune
et bien sûr quand je teste la requête dans mon phpmyadmin, j'ai le message suivant: #1242 - Subquery returns more than 1 row
ah ah j'suis sûre qu'on vous l'a jamais faite celle-là.
Bon, donc j'ai d'abord vu qu'il pouvait s'agir d'un problème de version..ouais!!
Ensuite, j'ai vu qu'on pouvait transformer une sous-requête en requête, et alors je suis perdue

Quelqu'un a la solution ??

Merci
clanou01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h22   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Pourquoi utiliser une sous requete ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
	com.nom_commune, 
	SEC_TO_TIME(SUM( CASE WHEN inter.atl_activite_id_activite=1 THEN inter.tps_activite ELSE 0 END)) AS surveillance
 	SEC_TO_TIME(SUM( CASE WHEN inter.atl_activite_id_activite=10 THEN inter.tps_activite ELSE 0 END)) antiadulte
FROM 
	atl_intervention inter 
INNER JOIN
	atl_commune com
ON	(inter.atl_commune_id_commune = com.id_commune)
WHERE 
	inter.date_intervention <= '2011-06-30' 
	AND inter.date_intervention >='2011-06-01' 
	AND com.code_dep = '17'
GROUP BY com.id_commune
Ne fonctionne t il pas ?

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h31   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Et vous pouvez même remplacer :
Code :
1
2
3
WHERE 
	inter.date_intervention <= '2011-06-30' 
	AND inter.date_intervention >='2011-06-01'
par :
Code :
1
2
WHERE 
	inter.date_intervention BETWEEN '2011-06-01' AND '2011-06-30'
Ce qui sera plus performant.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h38   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par ced Voir le message
Et vous pouvez même remplacer :
Code :
1
2
3
WHERE 
	inter.date_intervention <= '2011-06-30' 
	AND inter.date_intervention >='2011-06-01'
par :
Code :
1
2
WHERE 
	inter.date_intervention BETWEEN '2011-06-01' AND '2011-06-30'
Ce qui sera plus performant.
ah bon ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h17   #5
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Voir le tutoriel : http://sqlpro.developpez.com/cours/optimiser/#L9, transformation n°7...
Dans BETWEEN, les bornes sont incluses.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h22   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Yanika_bzh
ah bon ?
Ben d'après SQLPro, oui. Mais il précise qu'il faut quand même tester les transformations qu'il donne. En tout cas, cette transformation utilisant BETWEEN à au moins le mérite de rendre la requête plus claire.

Citation:
Envoyé par Yanika_bzh
Code :
1
2
3
INNER JOIN
    atl_commune com
ON    (inter.atl_commune_id_commune = com.id_commune)
Pendant que j'y suis, inutile de mettre la condition de jointure entre parenthèses !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h32   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
@Cinephil : La mise entre parenthèse n'affectant en rien la syntaxe de l'instruction, je préfère la garder... C'est un reliquat de ma méthode de développement au cours de ma carrière. Elle me permet de bien différencier la condition de jointure de la syntaxe de jointure (dans le but par exemple de génération automatique de documentation de sources).

En ce qui concerne le between, il serait intéressant d'analyser le plan d’exécution.

En tout cas, de mémoire, ce n'est pas le cas sur un moteur SYBASE 12.5x
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h59   #8
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
Vous êtes génialissimes !!! lol
Merci yanika_bzh, tu m'as enlevé une grosse épine du pied !!
J'ai cependant ajouté quelques modif' au code que tu m'as envoyé et ça marche!!
je le rebascule du coup pour ceux qui auraient le même problème que moi :
Code :
1
2
3
4
5
6
7
8
9
SELECT com.nom_commune, 
SEC_TO_TIME(SUM( TIME_TO_SEC (CASE WHEN inter.atl_activite_id_activite=1 THEN inter.tps_activite ELSE 0 END))) AS surveillance,
SEC_TO_TIME(SUM( TIME_TO_SEC (CASE WHEN inter.atl_activite_id_activite=10 THEN inter.tps_activite ELSE 0 END))) AS antiadulte
FROM atl_intervention inter 
INNER JOIN atl_commune com ON inter.atl_commune_id_commune = com.id_commune
WHERE inter.date_intervention <= '2011-06-30' 
AND inter.date_intervention >='2011-06-01' 
AND com.code_dep = '17'
GROUP BY com.id_commune
encore merci de prendre de votre temps pour les novices comme moi !!
clanou01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h23   #9
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
pourquoi quand je le mets dans mon php, ça ne marche pas?
ça met : undefined
clanou01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h29   #10
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
regardez vos log
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h30   #11
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
c'est à dire ?
clanou01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h31   #12
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
Le code PHP utilisé nous serait d'un grand secours pour t'aider.
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h34   #13
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
eh voilà,

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function get_activite_byDep_byDate($code_dep, $date_debut, $date_fin)
{
  $sql = "
 
          SELECT com.nom_commune, 
          SEC_TO_TIME(SUM(TIME_TO_SEC(inter.tps_prospection))) as tps_prospection, SEC_TO_TIME(SUM(TIME_TO_SEC(inter.tps_traitement))) as tps_traitement, SEC_TO_TIME(SUM(TIME_TO_SEC(inter.tps_controle))) as tps_controle, SUM(inter.quantite_produit) as quantite_produit,
          SEC_TO_TIME(SUM( TIME_TO_SEC (CASE WHEN inter.atl_activite_id_activite=1 THEN inter.tps_activite ELSE 0 END))) AS surveillance,
          SEC_TO_TIME(SUM( TIME_TO_SEC (CASE WHEN inter.atl_activite_id_activite=10 THEN inter.tps_activite ELSE 0 END))) AS antiadulte,
          SEC_TO_TIME(SUM( TIME_TO_SEC (CASE WHEN inter.atl_activite_id_activite=11 THEN inter.tps_activite ELSE 0 END))) AS urbain
          FROM atl_intervention inter 
          INNER JOIN atl_commune com ON (inter.atl_commune_id_commune = com.id_commune)
          WHERE inter.date_intervention <= '$date_fin' AND inter.date_intervention >='$date_debut' 
          AND com.code_dep = '$code_dep'
          GROUP BY com.id_commune
        ";
 
  $mysql = new base_mysql();
  //$mysql->base_Debug(true);
  $mysql->base_Open();
  $mysql->base_Query($sql);
  $mysql->base_Close();
 
  $retour = array();
  while ($row = $mysql->base_Fetch_Assoc()) {
    array_push($retour, $row);
  }
 
  return $retour;
}
clanou01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h47   #14
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
c'est bon, j'ai trouvé, cela venait de la requête mais de mon code pour générer un tableau où mettre les résultats.
encore merci
clanou01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h50   #15
Invité de passage
 
Femme
chargée de mission SIG
Inscription : juillet 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : chargée de mission SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2011
Messages : 9
Points : 1
Points : 1
cela NE venait PAS de la requête... punaise, vivement le w-e !!
bye bye
clanou01 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 00h04.


 
 
 
 
Partenaires

Hébergement Web