qu'est ce qui cloche dans ma requete?

Eléphanteau du PHP | 39 Messages

26 mars 2008, 15:57

voici ma requete .

J'aimerai savoir ce qu'il cloche.
Merci

Code : Tout sélectionner

SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS Nb_repas FROM ( ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS Nb_repas FROM cantine.menu_utilisateur WHERE menu_semaine = '10' ) UNION ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS Nb_repas FROM cantineln.menu_utilisateur WHERE menu_semaine = '10' ) ) GROUP BY admin_id ORDER BY admin_id ASC

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 mars 2008, 16:26

- L'absence de GROUP BY dans chaque sous requête alors qu'une fonction de groupe est appliquée ?
- L'absence d'une partie des champs "non groupés" dans le GROUP BY de la requête principale ?
- Le fait d'avoir mit des apostrophes autour d'un nombre alors que le champ est probablement de type numérique ?
- Le fait de faire appel au champ menu_jour dans la requête principale alors que celui-ci n'est pas retournée par les sous requête (c'est bien la peine de lui avoir donné un alias)

...

A part cela, peut être qu'un message d'erreur où une idée de ce qui se passe par rapport à ce qui devrait se passer nous donnerait (comme à toi) plus d'idées sur ce qu'il faut chercher exactement dans un premier temps ;)

Ps : ah oui, au fait.... on a un forum SQL ! :P
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 39 Messages

26 mars 2008, 16:39

oui c'est voici le message d'erreur : #1248 - Every derived table must have its own alias

Maintenant j'ai fait ca comme requete

Code : Tout sélectionner

SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS Nb_repas FROM ( ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS Nb_repas FROM cantine.menu_utilisateur WHERE menu_semaine = '10' GROUP BY admin_id ) UNION ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS Nb_repas FROM cantineln.menu_utilisateur WHERE menu_semaine = '10' GROUP BY admin_id ) ) Nb_repas ORDER BY admin_id ASC
par contre j'ai ca comme erreur ...
#1054 - Unknown column 'menu_jour' in 'field list'

Un ti coup de main ca ne serait pas refu !!! je ne suis pas une brtue epaisse en SQL !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mars 2008, 17:03

le message d'erreur signifie qu'il ne trouve pas la colonne "menu_jour" dans la liste des colonnes.

Et effectivement, chacun de tes select remonte une colonne nb_repas, mais pas de "menu_jour"
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 39 Messages

26 mars 2008, 17:08

Comment je peux faire.. je comprends pas trop !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mars 2008, 17:16

Dans une requête "SELECT champs FROM table", il faut que les champs du SELECT soient présent dans la table de la clause FROM.

Dans une requête "SELECT champs FROM (SELECT champs2 FROM table2)", il faut que les champs du 1er SELECT soit présent dans les champs du 2nd SELECT (celui qui est dans le FROM de la 1ère requête)

Dans ton cas, comme dans tes "SELECT DISTINCT ..." il n'y a pas de champ "menu_jour", le SELECT global ne peux pas le trouver.

NB : "count(menu_jour) as nb_repas" retourne un champ "nb_repas", pas un champ "menu_jour" ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 39 Messages

26 mars 2008, 17:27

Code : Tout sélectionner

SELECT DISTINCT admin_id, menu_semaine, asa FROM ( ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS asa FROM cantine.menu_utilisateur WHERE menu_semaine = '10' GROUP BY admin_id ) UNION ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS asa FROM cantineln.menu_utilisateur WHERE menu_semaine = '10' GROUP BY admin_id ) ) AS asa

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 mars 2008, 23:08

Ta requête fonctionne, mais...
- prends l'habitude de mettre TOUS les champs non groupés du select dans le GROUP BY, et pas juste un au hasard... MySQL arrive à s'en passer, mais c'est bien le seul SGBD à le faire...
- si menu_semaine est un int, tinyint, number, etc. il ne FAUT PAS mettre d'apostrophe autour des valeurs, ce sont des nombres, pas des chaines
- enfin, ton dernier AS asa donne l'alias "asa" à la "table" constituée de l'union de tes sous requête. Le même alias que celui que tu donnes à tes champs. C'est très confusant, surtout si c'est pour ne pas l'utiliser, autant ne pas le mettre :)
- Et tant qu'on y est, indente tes requête SQL également, il n'y a pas que le php que l'indentation rend plus lisible ;)

Code : Tout sélectionner

SELECT DISTINCT admin_id, menu_semaine, asa FROM ( ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS asa FROM cantine.menu_utilisateur WHERE menu_semaine = 10 GROUP BY admin_id, menu_semaine ) UNION ( SELECT DISTINCT admin_id, menu_semaine, count( menu_jour ) AS asa FROM cantineln.menu_utilisateur WHERE menu_semaine = 10 GROUP BY admin_id, menu_semaine ) )
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...