Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 05/01/2012, 20h04   #1
Invité de passage
 
Inscription : février 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 12
Points : 1
Points : 1
Par défaut Problème SQL imbriqué

Bonjour, pour mon petit site amateur j'ai besoin de faire une requête sql imbriquand une autre requête. J'ai fais ca

Code :
1
2
3
4
5
6
7
8
SELECT * FROM `ex_mycontest`,`ex_vote` 
WHERE `ex_mycontest`.`ex_myc_validation` = '1'
AND `ex_mycontest`.`ex_myc_proprietaire` <> '" . $_SESSION['id'] . "'
AND `ex_mycontest`.`ex_myc_actif` = '1'
AND `ex_mycontest`.`ex_myc_datetime` > '" . time() . "'  					
AND `ex_mycontest`.`ex_myc_multiple` > (SELECT COUNT(*)  FROM `ex_vote` WHERE `ex_vi_contest`='`ex_mycontest`.`ex_myc_id`' AND ex_vi_votant='" . $_SESSION['id'] . "' AND ex_vi_etat ='1' OR ex_vi_etat ='2')
ORDER BY `ex_mycontest`.`ex_myc_id` DESC 
LIMIT 20;
et voila le résultat si je le print
Code :
1
2
3
4
5
6
7
8
SELECT * FROM `ex_mycontest`,`ex_vote` 
WHERE `ex_mycontest`.`ex_myc_validation` = '1' 
AND `ex_mycontest`.`ex_myc_proprietaire` <> '1' 
AND `ex_mycontest`.`ex_myc_actif` = '1' 
AND `ex_mycontest`.`ex_myc_datetime` > '1325789742' 
AND `ex_mycontest`.`ex_myc_multiple` > (SELECT COUNT(*) FROM `ex_vote` WHERE `ex_vi_contest`='`ex_mycontest`.`ex_myc_id`' AND ex_vi_votant='1' AND ex_vi_etat ='1' OR ex_vi_etat ='2') 
ORDER BY `ex_mycontest`.`ex_myc_id` DESC 
LIMIT 20;
visiblement tout marche sauf '`ex_mycontest`.`ex_myc_id`' ligne 7 ... En mettant en dur une valeur (ex : 10) ma requete s'execute correctement et tout marche hors '`ex_mycontest`.`ex_myc_id`' ne se converti pas en '10'.

Comment faire pour donner le chiffre dans la deuxieme requête?

merci de votre aide
torn33260 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 08h37   #2
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
Bonjour,
il faut donner un alias à ta table dans la requête ptrincipale :

Code :
1
2
3
4
5
6
7
8
SELECT * FROM `ex_mycontest` C,`ex_vote` 
WHERE `ex_mycontest`.`ex_myc_validation` = '1'
AND `ex_mycontest`.`ex_myc_proprietaire` <> '" . $_SESSION['id'] . "'
AND `ex_mycontest`.`ex_myc_actif` = '1'
AND `ex_mycontest`.`ex_myc_datetime` > '" . time() . "'  					
AND `ex_mycontest`.`ex_myc_multiple` > (SELECT COUNT(*)  FROM `ex_vote` WHERE `ex_vi_contest`= C.`ex_myc_id` AND ex_vi_votant='" . $_SESSION['id'] . "' AND ex_vi_etat ='1' OR ex_vi_etat ='2')
ORDER BY `ex_mycontest`.`ex_myc_id` DESC 
LIMIT 20;
Par contre toutes ces quotes sont-elles nécessaires ?
En théorie on n'a pas à mettre de quotes autour des noms de tables et de champs ... après c'est du mysql je suppose mais est-ce tout de même nécessaire ?
__________________
Le Porc est un loup pour le Porc.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 10h09   #3
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !
Ce ne sont pas des vraies quotes (sinon ça passerait pas)... et ça sert à encapsuler les noms d'objets étranges (des espaces, ...)

Ce n'est pas spécifique à MySQL. Sous Oracle, tu peux passer les noms d'objets entre double quotes

Code :
1
2
3
4
5
6
7
8
9
 
SELECT * FROM "DUAL"
 
D
-
X
 
 
1 row selected.
Par ailleurs, je suppose que certains générateurs de code doivent te mettre systématiquement des back quotes autour des noms d'objets ? Ou alors c'est une convention douteuse dans certains endroits ?

PS : et je m'avance peut être un peu, mais il me semble que sous SQL Server tu peux mettre des [] autour des noms d'objets DB.
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 10h16   #4
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
Ah ok, en DB2 il me semble aussi qu'on peut utiliser les doubles quotes pour le faire, mais là en l'occurence les noms d'objets sont normaux donc les quotes ne sont pas nécessaires.
Merci pour l'info.

Juste petite précision comme j'ai du faire du MySql une seule fois, si SELECT * FROM `ex_mycontest` C ne passe pas essaye SELECT * FROM `ex_mycontest` AS C
__________________
Le Porc est un loup pour le Porc.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 10h19   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Par contre là
Code :
1
2
 
'`ex_mycontest`.`ex_myc_id`'
Y a bien un problème de quote
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 11h18   #6
Invité de passage
 
Inscription : février 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 12
Points : 1
Points : 1
Bonjour, visiblement il falait simplement rajouter le nom de la table dans la seconde requête :

Code :
1
2
3
4
5
6
7
8
9
 
SELECT * FROM `ex_mycontest` ,`ex_vote` 
 WHERE `ex_mycontest`.`ex_myc_validation` = '1'
 AND `ex_mycontest`.`ex_myc_proprietaire` <> '" . $_SESSION['id'] . "'
 AND `ex_mycontest`.`ex_myc_actif` = '1'
 AND `ex_mycontest`.`ex_myc_datetime` > '" . time() . "'                                         
 AND `ex_mycontest`.`ex_myc_multiple` > (SELECT COUNT(*)  FROM <span style="font-weight: bold">`ex_mycontest`</span> , `ex_vote` WHERE `ex_vi_contest`= `ex_myc_id` AND ex_vi_votant='" . $_SESSION['id'] . "' AND ex_vi_etat ='1' OR ex_vi_etat ='2')
 ORDER BY `ex_mycontest`.`ex_myc_id` DESC 
 LIMIT 20";
merci et bonne journée
torn33260 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 11h39   #7
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
On n'a pas plus d'infos sur ce à quoi correspondent tes champs et tes variables PHP mais cette requête ne fait absoluement pas la même chose que la requête de départ.
__________________
Le Porc est un loup pour le Porc.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2012, 11h55   #8
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
J'ai remarqué aussi que dans ta requête principale la table ex_vote apparait alors que tu ne l'utilises que dans ta sous-requête. Cela doit influencer ton SELECT *, tu devrais l'enlever.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 15h42   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
C'est une horreur cette requête !

1) Évite la guerre des étoiles !

2) Tu mets deux tables dans le FROM mais aucune condition de jointure dans le WHERE. Tu fais donc le produit cartésien des deux tables.
Est-ce que tu souhaites ?

Si tu fais une jointure entre les deux tables, apprends à l'écrire selon la syntaxe en vigueur depuis 20 ans !

Mais comme dit lola06, si la table ex_vote est inutile dans la requête principale, supprime là carrément.

3) Si les colonnes du WHERE sont de type numérique, comme le suggèrent les valeurs cherchées (sauf la date), inutile d'ajouter des apostrophes !

4) Plutôt que la fonction time() de PHP, utilise la fonction CURRENT_TIME du langage SQL.

5) Utilise des alias dès qu'il y a plus d'une table dans une requête ; ça rend la requête plus agréable à lire.

Voici la requête partiellement nettoyée :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT -- les colonnes nécessaires et pas étoile !
FROM ex_mycontest c
INNER JOIN ex_vote v ON -- Condition de jointure !
WHERE c.ex_myc_validation = '1' -- Colonne numérique ? => Pas d'apostrophes !
	AND c.ex_myc_proprietaire <> '" . $_SESSION['id'] . "' -- Colonne numérique ? => Pas d'apostrophes !
	AND c.ex_myc_actif = '1' -- Colonne numérique ? => Pas d'apostrophes !
	AND c.ex_myc_datetime > CURRENT_TIME
	AND c.ex_myc_multiple > 
	(
		SELECT COUNT(*)  
		FROM ex_vote 
		WHERE ex_vi_contest = c.ex_myc_id 
			AND ex_vi_votant = '" . $_SESSION['id'] . "' -- Colonne numérique ? => Pas d'apostrophes !
			AND ex_vi_etat = '1' -- Colonne numérique ? => Pas d'apostrophes !
			OR ex_vi_etat = '2' -- Colonne numérique ? => Pas d'apostrophes !
	)
ORDER BY c.ex_myc_id DESC 
LIMIT 20;
__________________
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 actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 11h00   #10
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Citation:
Envoyé par pacmann Voir le message
Ce n'est pas spécifique à MySQL. Sous Oracle, tu peux passer les noms d'objets entre double quotes
Il me semble que quand on double-quote les objets sous Oracle dans un ordre CREATE, ça a un effet spécifique; en l'occurence, ça fige la case-sensitivity du nom, alors que les noms des objets sont normalement case-insensitive.

En clair si on fait

on peut faire

mais si on fait

Code :
CREATE TABLE "theTable"
tout autre variation de casing de theTable ne sera pas reconnu.
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 11h31   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Pour Oracle je ne sais pas encore mais depuis que j'ai découvert ce piège dans Postgresql, je nomme toutes mes tables et colonnes en minuscules !
__________________
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 actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h15.


 
 
 
 
Partenaires

Hébergement Web