Page 1 sur 1

tri sur 2 tables pas si simple...

Posté : 13 sept. 2014, 09:12
par diice
Bonjour à tous,

J'ai un souci sur un tri sur 2 tables.
j'ai effectué des join et en ca je n'ai pas trop de probleme.
le souci c'est que pour le tri, je suis obligé de faire un calcul dans ma requete sql, et c'est là que ca peche...

je m'explique, j'ai une table de "lieux" avec id, nom etc...
et une table Notes avec id, id_lieu, note1, note2, note3, note4, note5 (hé oui, il y a 5 criteres de notes).

du coup j'ai besoin dans mon tri de faire une moyenne sur le nombre total de vote (tous criteres confondu) par rapport aux avis (avis=5notes) total...
je sais pas si c'est tres clair... en fait j'aimerai classé mes lieu par notes, mais ne pas privilégié ceux qui ont été noté le plus de fois, mais par rapport à une note moyenne globale...

j'ai essayé avec plusieurs solutions mais sans resultats... (je remplace tous mes champs par *dans le select pour alléger le code...)
select *,
	(SELECT count(1) FROM ".$TB_NoteCom." C WHERE C.id_lieu=L.id) AS TotalVotes,
	(SELECT AVG(N.note_critere1+N.note_critere2+N.note_critere3+N.note_critere4+N.note_critere5)/TotalVotes) as NoteTotale
 from TableLieux L
left join TableNotes N on N.id_lieu=L.id
group by N.id_lieu
order by NoteTotale desc
et la, ca ne me donne rien de bon, soit il me ramene 2 fois le meme lieu (d'ou le group by), mais le group by... il aime pas...
bref, je ne sais absolument pas comment m'en sortir !!

merci d'avance si vous aviez une idée ;)

bonne journée et bon weekend a vous en attendant !

Re: tri sur 2 tables pas si simple...

Posté : 15 sept. 2014, 22:45
par diice
personne ne peut m'aider ???

Re: tri sur 2 tables pas si simple...

Posté : 17 sept. 2014, 10:16
par arnaud69
Bonjour,

Plutôt qu'une requête complexe appelée à chaque consultation de la page, je ferais un trigger qui recalcule la note de chaque lieu, et je ferais un update d'un chmap note dans la table des lieux.
Ainsi tu n'aurais qu'un select à faire pour afficher la note du lieu et le lieu.

Sinon, il faudrait que tu mettes en code ici un dump de la descirption des tables avec quelques enregsitrements, ce qui permettrait à ceux qui veulent bien t'aider de reproduire cela en local, car cette requête a le mérite d'être assez intéressante.

Re: tri sur 2 tables pas si simple...

Posté : 18 sept. 2014, 00:34
par diice
tout d'abord, merci Arnaud de ta réponse ! :)

ensuite qu'appelles-tu un trigger ??

sinon pour le dump, je fais un export de mes tables concernées et j'affiche ici ? c ca ??

Re: tri sur 2 tables pas si simple...

Posté : 18 sept. 2014, 08:00
par arnaud69
Bonjour,

en gros, un trigger est un événement programmé qui se déclenche tout seul lorsqu'une action est effectuée sur une table.
La doc :
http://dev.mysql.com/doc/refman/5.0/fr/ ... igger.html

Re: tri sur 2 tables pas si simple...

Posté : 18 sept. 2014, 08:24
par diice
ahhhh c excellent !!! je ne connaissais pas du tout, et meme jamais entendu parlé !!!
faut que je reflechisse comment l'utiliser et mettre a jour mes sites, par ce que c'est clair qu'il y a du potentiel la dedans !!!
merci pour ça ;)

en fait, ce que tu me dis, c'est que quand les gens laisse un avis, dans ma requete d'enregistrement de l'avis, je mets un trigger after par exemple sur ma table lieu, à laquelle j'aurais ajouté 2 nouveaux champs 'NOTES' et/ou 'nbVotes' ?? c ca ?? et que je mettrai a jour avec l'avis ?
en fait ma table NOTES a 12 champs :

sinon voilà la structure de mes tables :
--
-- Structure de la table `CL_notes_commentaires`
--

CREATE TABLE `CL_notes_commentaires` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `valide` enum('oui','non') NOT NULL DEFAULT 'oui',
  `id_lieu` int(6) NOT NULL,
  `type_votant` enum('groupe','public') NOT NULL DEFAULT 'groupe',
  `id_votant` int(6) NOT NULL,
  `note_critere1` int(1) NOT NULL,
  `note_critere2` int(1) NOT NULL,
  `note_critere3` int(1) NOT NULL,
  `note_critere4` int(1) NOT NULL,
  `note_critere5` int(1) NOT NULL,
  `commentaire` text NOT NULL,
  `datedu` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;


-- exemple Contenu de la table `CL_notes_commentaires`

INSERT INTO `CL_notes_commentaires` (`id`, `valide`, `id_lieu`, `type_votant`, `id_votant`, `note_critere1`, `note_critere2`, `note_critere3`, `note_critere4`, `note_critere5`, `commentaire`, `datedu`) VALUES(1, 'oui', 1, 'groupe', 1, 2, 3, 3, 5, 4, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at augue velit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec porttitor rutrum lectus, ut convallis nisi blandit id.', '2014-06-02 08:25:23');
et pour la structure de la table lieu :
--
-- Structure de la table `CL_lieux`
--

CREATE TABLE `CL_lieux` (
  `id` int(7) NOT NULL AUTO_INCREMENT,
  `valide` enum('oui','non') NOT NULL DEFAULT 'non',
  ...
  `nom` varchar(255) NOT NULL COMMENT 'nom du lieu',
  `description` text NOT NULL,
  `photo` varchar(255) DEFAULT NULL,
  ...
  `maj_fiche` datetime NOT NULL,
  `hash_valide` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

--
-- Contenu de la table `CL_lieux`
--

INSERT INTO `CL_lieux` (`id`, `valide`, ..., `nom`, `description`,`photo`, ..., `maj_fiche`, `hash_valide`) VALUES(1, 'oui', ..., 'Nom du Lieu', 'description du lieu', 'photo_lieu_le_babel_caf-2014May31_161310.jpg',..., '2014-08-18 11:45:30', '');
(je vous ai enlevé tous les champs qui ne nous interessent pas....)


donc, et du coup avec tout ce texte, je remets ce que je cherche a faire..

- trier les lieux en fonction de la moyenne des notes que les internautes auront donné. (moyenne = moyenne de toutes les 5 notes / nb d'avis)
- et j'aurai une autre question mais on verra plus tard (comment trier en fonction du taux de remplissage de fiche des lieux...) du coup p't'etre avec un trigger ;) a voir...


bonne journée a vous,