Page 1 sur 1

Requete complexe (?)

Posté : 07 janv. 2008, 12:46
par HK
Bonjour,

je créé un site permettant de saisir des critiques.
je cherche a récupérer l'oeuvre ayant le plus de citique et la meilleur moyenne

j'ai une table Oeuvre(idOeuvre, titre), une table Critique(idCritique, titre, note) et une table de jointure(idOeuvre,idCritique).

Code : Tout sélectionner

CREATE TABLE `critiques` ( `idCritique` int(200) NOT NULL auto_increment, `titre` varchar(255) NOT NULL default '', `texte` blob NOT NULL, `note` int(100) NOT NULL default '0', PRIMARY KEY (`idArticle`) ) CREATE TABLE `oeuvre` ( `idOeuvre` int(200) NOT NULL auto_increment, `titre` varchar(255) NOT NULL default '', PRIMARY KEY (`idOeuvre`) ) CREATE TABLE `jointure` ( `idOeuvre` int(200) NOT NULL, `idArticle` int(200) NOT NULL, PRIMARY KEY (`idOeuvre`) )

j'ai essayer quelque chose comme ca :

Code : Tout sélectionner

select count(critiques.titre) as somme, oeuvre.titre from critiques, oeuvre, jointure where critiques.idCritiques = jointure.idCritiques AND oeuvre.idOeuvre = jointure.idOeuvre group by oeuvre.titre inter ( select avg(critiques.note) as somme, oeuvre.titre from critiques, oeuvre, jointure where critiques.idCritiques = fointure.idCritiques AND oeuvre.idOeuvre = jointure.idOeuvre group by oeuvre.titre ) order by somme desc
mais ca ne fonctionne pas

par contre indépendemment les deux requetes fonctionnent bien mais l'intersection n'a pas l'air de lui plaire

Merci pour vos réponses

Posté : 07 janv. 2008, 12:55
par Sékiltoyai
Le problème c'est que les 2 sommes doivent être strictement identiques. Est ce le cas ?

Sinon, autre chose, pour une jointure, utilise JOIN, c'est plus rapide : http://dev.mysql.com/doc/refman/5.0/fr/select.html
Et je ne suis pas sur que tu aies besoin d'une table de jointure. Si un article ne traite que d'une œuvre, tu peux faire un champ Œuvre dans ta table Critiques…
Sinon, int(200) c'est beaucoup, un champ int ne dépassera pas 4 octets. Quelle est ta limite sur ces champs ? http://dev.mysql.com/doc/refman/5.0/fr/ ... ments.html

Posté : 07 janv. 2008, 13:14
par hk
merci pour la réponse,

les 2 sommes ne peuvent pas être identiques puisque que l'on liste deux choses différentes.

si les sommes ne sont pas identique, y a t il un moyen de récupere les résultts d'une autre maniere ?

Posté : 07 janv. 2008, 13:32
par Ryle
Ce sont deux recherches totalement indépendantes et elles mériteraient deux requêtes distinctes.. au pire tu peux les rassembler en une seule avec un union mais bon....
J'verrais un truc du genre :

Code : Tout sélectionner

SELECT COUNT(critiques.idCritique) AS somme, oeuvre.titre FROM critiques, oeuvre, jointure WHERE critiques.idCritiques = jointure.idCritiques AND oeuvre.idOeuvre = jointure.idOeuvre GROUP BY oeuvre.titre ORDER BY somme LIMIT 0,1 SELECT AVG(critiques.note) AS moyenne, oeuvre.titre FROM critiques, oeuvre, jointure WHERE critiques.idCritiques = jointure.idCritiques AND oeuvre.idOeuvre = jointure.idOeuvre GROUP BY oeuvre.titre ORDER BY moyenne LIMIT 0,1