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 29/01/2012, 11h20   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 75
Points : 13
Points : 13
Par défaut Problème sous requête

Bonjour à tous,


Question à deux sous ...

J'ai une requête + sous requête :

Code :
1
2
3
SELECT *, (SELECT COUNT(*) FROM product AS prod WHERE category_id = cat.id)  AS nbproduct 
FROM category AS cat 
WHERE  nbproduct  > 0 LIMIT 2
J'ai l'erreur :
Unknown column 'nbproduct' in 'where clause'

Ça doit être tellement évident que ça ne me saute pas aux yeux ...
darkloy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 11h22   #2
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 75
Points : 13
Points : 13
Code :
1
2
3
SELECT *, (SELECT COUNT(*) AS nbproduct  FROM product AS prod WHERE category_id = cat.id)  AS nbproduct 
FROM category AS cat 
WHERE  prod.nbproduct  > 0 LIMIT 2
Idem !
darkloy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 11h44   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Saluton,
Deux choses, d'abord merci de na pas raviver la guerre des étoiles,
ensuite, les alias ne sont pas connus de MySQL avant la fin du SELECT, donc seulement après le WHERE.
Je te conseille de t'en tirer comme cela :
Code :
1
2
3
4
5
SELECT lesnomsdescolonneskivontbienplutotk*, (SELECT COUNT(*) AS nbproduct  FROM product AS prod WHERE category_id = cat.id)  AS nbproduct 
FROM category AS cat 
GROUP BY cat.id
HAVING prod.nbproduct  > 0 
LIMIT 2
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 13h27   #4
Membre du Club
 
Consultant KPI
Inscription : août 2010
Messages : 23
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant KPI

Informations forums :
Inscription : août 2010
Messages : 23
Points : 43
Points : 43
Bonjour,

La sous-requête est-elle vraiment nécessaire ?
Code :
1
2
3
4
5
6
7
8
9
 
SELECT	 <liste colonnes autres>,
         cat.id, 
         COUNT(*) AS nbproduct
FROM	 category AS cat INNER JOIN product AS prod
                                 ON Prod.category_id = cat.id 
GROUP BY <liste colonnes autres>, 
         cat.id
HAVING 	 COUNT(*) > 0 LIMIT 2;
Par contre je m'interroge sur le "LIMIT 2".
Quel est le but ? Si tu veux sélectionner les catégories qui ont le plus de produits, il faut rajouter une clause ORDER BY. La requête devient alors
Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT	 <liste colonnes autres>,
         cat.id, 
         COUNT(*) AS nbproduct
FROM	 category AS cat INNER JOIN product AS prod
                                 ON Prod.category_id = cat.id 
GROUP BY <liste colonnes autres>, 
         cat.id
ORDER BY COUNT(*) DESC
HAVING 	 COUNT(*) > 0 LIMIT 2;
DeTraX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 21h23   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 75
Points : 13
Points : 13
Wouaw, de retour sur mon pc, merci pour votre aide messieurs !!
Disons que pour les jointures, quand j'ai commencé Sql ça m'effrayais rapidement. Et encore un peu maintenant
Je ne veux aucunement raviver la guerre des étoiles, c'est juste pour rendre plus clair mon exemple de requête Je n'utilise jamais d'étoiles (ou rare cas ou je dois vraiment récupérer tous les champs !)

Deux bons exemples !


J'avais oublié l'ami "HAVING"

Merci beaucoup, j'ai pas mal rouillé sous sql et le retour est un peu difficile sur des choses basiques...
darkloy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 21h35   #6
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 75
Points : 13
Points : 13
Code :
1
2
3
4
5
6
7
8
9
10
	$mysqlRequest = $this->DB->query(
					"SELECT	 prod.id, prod.name, prod.pictureUrl, prod.description, prod.price,
							 cat.id, 
							 COUNT(*) AS nbproduct
					FROM	 category AS cat INNER JOIN product AS prod
													 ON prod.category_id = cat.id 
					WHERE (category_id = ".(int)$requestAry["catId"]."	AND subcategory_id = 0) OR subcategory_id =".(int)$requestAry["catId"].
					" GROUP BY prod.id, prod.name, prod.pictureUrl, prod.description, prod.price,
							 cat.id
					HAVING 	 COUNT(*) > 0");

Nickel !! Merci encore à vous deux et bonne soirée
darkloy 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 13h50.


 
 
 
 
Partenaires

Hébergement Web