Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 01/01/2011, 01h30   #1
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
Par défaut having 'all' ?

Bonjour, (et bonne année)

Je cherche à faire une requête assez simple du style :

"obtenir un exemplaire disponible d'un livre" dans le cadre d'une location de livres"

=> Obtenir tous les exemplaires de livre en tenant compte du fait de l'historique des commandes, les commandes ayant le status 2 indiquent que l'exemplaire est rentré (et donc disponible), un autre status signifie que l'exemplaire n'est pas disponible.

J'ai donc une requête :

Code :
1
2
3
4
5
6
7
8
 
$sql = 'SELECT copy.id_copy, copy.id_book, sendingstatus
			FROM copy 
			LEFT JOIN command ON copy.id_copy = command.id_copy 
			WHERE copy.id_book = iddulivre
			GROUP BY copy.id_copy
			HAVING TOUS sendingstatus=2 Or TOUS sendingstatus is null
			';
voilà donc en fait je connais pas la façon de dire en sql pour la clause having, "tous les champs = unevaleur"..

Merci
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 10h10   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Si tu mets une clause WHERE ou un HAVING cela s'applique deja a toutes les lignes.

Si tu parles de toutes les colonnes, je ne vois pas ce que tu veux faire.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 11h12   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Moi non plus je comprends pas tout mais généralement quand en SQL on parle de "tout ou tous" on emploi généralement EXISTS
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 11h46   #4
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
si je met un where (et que j'enlève le groupby),
il va me retourner la copie si au moins une commande a le status 2, alors qu'il faut qu'elles soit toutes avec le status deux (ou qu'il n'y ait pas de commande) pour que la copie soit retenue.

concernant le having il porte sur un groupe de status (group by id_copy)
ne faut-il donc pas un mot clé de groupe pour spécifier ce champ dans cette clause ?
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 12h17   #5
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Voir mon lien précédent...

Tu dois faire une requête avec WHERE NOT EXISTS(...) et tester la non-existence d'un status valant 2. Si tel est le cas, alors cela répond à ta problèmatique
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 12h34   #6
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
Ca me semble "bizarre" que ce soit dans la clause where et pas dans la clause having, quoi qu'il en soit je dois faire une sous-requête mais je vois pas trop comment faire.
WHERE NOT EXISTS (SELECT * FROM Command WHERE id_copy = copieactuelle AND status != 2)

ma requête serait alors :

Code :
1
2
3
4
5
 
SELECT id_copy,note,id_book
			FROM copy 
			WHERE copy.id_book = idlivre
			AND NOT EXISTS (SELECT * FROM command WHERE command.id_copy = copy.id_copy AND sendingstatus != 2)
le manuel dit :
"Si une sous-requête retourne absolument aucune valeur, alors la clause EXISTS <subquery> est TRUE"

cela ne devrait pas être l'inverse ?

j'ai testé ça fonctionne correctement, mais je comprend quand même pas le manuel (je fais comme je pense et ça fonctionne)
Oprichnik est dé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 16h20.


 
 
 
 
Partenaires

Hébergement Web