Probleme requete group by

cs_lowkey Messages postés 260 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 5 novembre 2010 - 31 mars 2008 à 11:59
cs_lowkey Messages postés 260 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 5 novembre 2010 - 1 avril 2008 à 13:02
Salut à tous !

Voici ma requete :

SELECT t.id_artisan FROM cp_artisan, travail_artisan t INNER JOIN travail_artisan t1 ON t1.id_artisan = t.id_artisan AND t1.id_prestation=4 INNER JOIN travail_artisan t2 ON t2.id_artisan = t.id_artisan AND t2.id_prestation=102 WHERE t.id_prestation=19 limit 0, 20

Elle marche tres bien!

Mais si je rajoute un GROUP BY :

SELECT t.id_artisan FROM  travail_artisan t INNER JOIN travail_artisan t1 ON t1.id_artisan = t.id_artisan AND t1.id_prestation=4 INNER JOIN travail_artisan t2 ON t2.id_artisan = t.id_artisan AND t2.id_prestation=102 WHERE t.id_prestation=19 GROUP BY t.id_artisan limit 0, 20

La requete n'aboutie pas. En la testant sous phpmyadmin, le serveur 'shutdown' parce qu'elle prend trop de temps...

Quelqu'un a une idée du pourquoi et comment y remédier ?

Merci !!

<hr />
lowke<sub>yhttp://s11.bitefight.fr/c.php?uid=45971</sub>

5 réponses

MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
31 mars 2008 à 15:22
Salut,

Dans ta requête :
 quelle est la relation avec cp_artisan ?
 sauf erreur, t1.id_prestation=4 ne devrait pas venir dans les Where ?
 pourquoi appeler 3 fois la table travail_artisan ?
 qu'ont en commun les prestations 4, 102 et 19 ? // ... WHERE id_prestation in ( 4 , 102 , 19 )

+ Un peu de commentaire autour du code ..

Bon boulot !
 

 
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mars 2008 à 20:28
Hello,

t'as tjrs pas fini ton bin's ? ;-)

Encore une fois, tu devrais montrer la structure de tes tables.
Et dire ce que tu cherches à faire.

Autre chose : elles sont très remplies, tes tables ?
0
cs_lowkey Messages postés 260 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 5 novembre 2010 1
31 mars 2008 à 23:30
Lol ,Wé, toujours et encore le meme merdier... Je suis pas abitué aux inner/left join donc je galere... J'ai appris avec Where table1.foreign_key=table2.primary_key don cfaut que je me remette un peu à jour...

Enfin, pour malalam, la structure de la table :

CREATE TABLE `travail_artisan` (
  `id_artisan` int(11) NOT NULL default '0',
  `id_prestation` int(11) NOT NULL default '0',
  `niveau` int(11) NOT NULL default '1',
  PRIMARY KEY  (`id_artisan`,`id_prestation`)
) ;

Dans ma premiere requete : erreur de ma part, cp_client n'a rien à faire là...

Mes tables sont bien remplies : 3'134'266 entrées

Je cherche toujours a faire la meme chose, trouver une liste d'artisans qui 'pratique' la liste ENTIERE de prestations qui lui est donnée.
Je me suis servi de ce que tu m'avais donné malalam, et ça marche du tonnerre ! Du moins si je ne met pas de group by...

Dans ce cas, je ne sais pas si un group by est necessaire, mais simple curiosité...

Voila voila...

<hr />lowke<sub>yhttp://s11.bitefight.fr/c.php?uid=45971</sub>
0
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
1 avril 2008 à 09:10
Salut lowkey,

Si je comprends bien ta structure, tu as trois tables en jeux :
une table des artisans,
une table des prestations, 
une table travail_artisan qui établirait une relation NN entre les artisans et les prestations ?

Ceci va t il t'inspirrer ?

-- Le nombre de prestations par artisan

Select id_artisan , count(id_prestation) as nbr_prestation
from travail_artisan
group by id_artisan
having nbr_prestation = ( select 109 )
order by nbr_prestation

-- A la place de ( select 109 ), tu peux faire appel à une requete qui compte le nombre de prestations, que tu mets entre parenthèses !
having nbr_prestation = ( Select count(id_prestation) from table_des_prestations )

MAIS : je ne sais pas si tu as un index qui garantit  l'unicité du couple id_artisan , id_prestation, car sinon cette manière de faire ne sera pas fiable !

Je te conseil de lire de l'information sur les bases de données ( par ex http://sql.developpez.com/ ) , petit à petit.

Bon boulot !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_lowkey Messages postés 260 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 5 novembre 2010 1
1 avril 2008 à 13:02
Salut MasterCent !

Non, je n'ai qu'une seule table : celle dont j'ai donné la structure.

Exemple des donnes :

id_artisan | id_prestation | niveau
13           | 4                  | 1
13           | 5                  | 1
13           | 6                  | 1
12           | 4                  | 1
12           | 5                  | 1
16           | 4                  | 1

Ben je veux les artisans qui ont les prestation 4 ET 5 ET 6 donc, dans ce cas, UNIQUEMENT l'artisan 13

<hr />lowke<sub>yhttp://s11.bitefight.fr/c.php?uid=45971</sub>
0