[RESOLU] jointures sql et COUNT

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] jointures sql et COUNT

Re: jointures sql et COUNT

par diice » 27 févr. 2014, 11:13

Booon, si on ressort tous les deux grandits c que du bon !
Ok ok pour l alias je vais corriger ça toute de suite !

He oui c grandement résolu :-)
Bonne journée à toi !

Re: jointures sql et COUNT

par moogli » 27 févr. 2014, 10:48

de rien ça sert à ça un forum ;)

pi au moins j'aurais appris que je peux utiliser une somme dans le order by (jamais eu besoin jusqu'ici ;) )

pour le doublon c'était le doublon de l'alias. dans les deux sous requête tu avait vue v du coup, si cela était possible tu aurais, potentiellement, deux alias avec le nom, ce qui n'est pas possible un alias n'est définit qu'une fois ;)


si ton estime ton sujet résolus peux tu cliquer sur le bouton vert a droite du titre stp ;)

merci

@+

Re: jointures sql et COUNT

par diice » 26 févr. 2014, 19:12

pour le total il te faut faire la somme des deux , donc a tester dans le order by mais j'y crois pas trop
en fait ca marche :)
order by NbVotesPos+NbVotesNeg desc
c bien fait quand meme :)

donc, nikel, c parfait !
j'ai ce que je veux !!

juste savoir sur les doublons des requetes histoire que j'ameliore le truc au cas ou :)


sinon, je te remercie enormement !
tu m'as fait gagner quelques jours de recherche vu que je ne serai pas du tout parti la dessus !

Re: jointures sql et COUNT

par diice » 26 févr. 2014, 19:05

bon, c plus clair :)
merci !

1 - par contre tu me parles du doublon, je suppose avec les subselect vote, mais comment puis-je faire pour distinguer les 2 types de vote dans un seul select ?

2 - sinon, parfait mes tris marchent nikel avec NbVotesPos et NbVotesNeg dans le order ! cool! merci :)

3 - et pour le total, je vais voir ca, mais si je rajoute un subselect ca va faire un triblon !! j'attends ta reponse du 1 pour voir si je peux le faire

4- et sinon pour les sum, en fait je n'en ai pas fait, je'ai fat du count pour compter le nombre de ligne avec +1 ou -1, ca evite de faire de la formule pour repasser les negatif en positif a l'affichage. et puis j'ai qu'une colonne 'vote' (enum('1','-1')) qui stocke les 1 et les -1, donc c plus simple ;)

bon je vais chercher pour le total en attendant taréponse !

merci bien en tout cas pour tout ca :D

Re: jointures sql et COUNT

par moogli » 26 févr. 2014, 17:08

effectivement dans la requête principale on ne connais pas vu, c'est dans le subselect (sans parler du doublon ;)).

donc pour ordonrer sur les vote positif / négatif tu utilise les colonnes NbVotesPos & NbVotesNeg qui existe.
pour le total il te faut faire la somme des deux , donc a tester dans le order by mais j'y crois pas trop sinon dans le select ajoute une colonne qui est la somme des deux et ordonne dessus.

attention sum c'est la somme d'une colonne entière (suivant le prédicat) voir avec un groupement pas la somme de deux colonne sur une ligne (ça c'est le signe plus ;) ).

@+

Re: jointures sql et COUNT

par diice » 26 févr. 2014, 15:35

Bonnn !!

j'avance pas mal du tout !!

voilà ou j'en suis, la ou ca m'affiche ce que je veux (sans la liste desvotants que je ferai effectivement en ajax)
SELECT 
PR.Valide, PR.idType, PR.idStand, PR.idCompte, PR.DateProposition,
T.Type, T.GenreType,
CP.PrenomCompte, CP.NomCompte,
(SELECT count(1) FROM Commentaires CM WHERE CM.Valide='oui' and PR.idStand = CM.idStand and PR.idType=CM.idType) AS NbComm,
(SELECT count(1) FROM Votes V WHERE PR.idStand = V.idStand and PR.idType=V.idType and V.Vote='1') AS NbVotesPos,
(SELECT count(1) FROM Votes V WHERE PR.idStand = V.idStand and PR.idType=V.idType and V.Vote='-1') AS NbVotesNeg
FROM Propositions PR
JOIN Types PN 
USING(idType)
JOIN ComptesClient CP
USING(idCompte)
WHERE PR.idStand='".htmlentities($_GET['id'])."'
ORDER BY T.Type asc
donc, la c nikel !

par contre je me retrouve bloqué a l'etape suivante du tri !!
effectivement, j'ai un menu deroulant pour trier tout ça...
je tri sans souci par ordre alphabetique, les derniers propositions postées. pour ca ok.

par contre, j'aimerai trier par votes :
1- tri par votes negtif (ceux qui enont le plus),
2 - positifs (pareil),
3 - tri par nb votes total (negatifs+positifs)

donc, j'ajoute a ma requete Order pour le tri des negatifs : (je ne repete pas 'order by', je le remets pour la compréhension...)
order by sum(V.Vote) desc
et là,il me dit qu'il ne connait pas V.Vote !!!
du coup, j'ai essayé d'ajouter V.idVote, V.Vote dans le SELECT, mais rien n'y fait
j'ai aussi essayé d'ajouter un JOIN USING avec les votes mais pareil, a la limite il ne me ramene qu'un seul resultat (toujouts le meme suivant qu'il soit positif ou negatif)....

Je trouve ca bizarre, puisque dans les sub select ils sont declarés non ??? en tout V.Vote est déclaré ?
je comprends pas trop...

Re: jointures sql et COUNT

par diice » 26 févr. 2014, 13:43

hello :)

et merci de ta reponse :)

alors :
0/ merci :) je ne savais pas alors, je vais retravailler les * et pousser plus vers la voie du jedi :) merci
1/ ok, c noté...
2/ oui effectivement a part les commentaires et vote (qui peuvent etre vides en focntions des propositions) aucune ne doit etre vide c kler ! c pour ca que j'etais passé par le inner join... mais si une classique le fait, ca le fait :)
3/ en fait le truc c'était de tout recuperer pour faire un array multidimentionnel et apres trier plus facilement...

apres effectivement, je ne l'ai pas précisé mais les infos de 'createur de la proposition' et les commentaires ainsi que la liste des votants apparaissent dans un tooltip... mais je n'ai pas pensé a utiliser ajax pour pas surcharger le loading de la page ! good idea ! gracias :)

du coup, merci pour ton exemple !

j'ai une petite question a ce propos d'ailleurs, j'ai lu que les sub select surchargeaient aussi les requetes, ce pourquoi je n'ai meme pas tenté de les faire, qu'en est-il ?

merci encore beaucoup !
j'essaye tout ça et je tiens au jus !
bonne journée a toi

Re: jointures sql et COUNT

par moogli » 26 févr. 2014, 12:46

salut,
0/ Le select * c'est le mal (le coté obscure ....)
1/ la jointure gauche (ou droite d'ailleurs) est à utiliser avec parcimonie si tu veux éviter les produits cartésiens.
2/ vu la structure il n'y a pas de raison que les tables référencée soit vide (ou alors il y a un problème si les FK sont vide ;) )
3/Si tu récupère tous en une seule fois tu va te faire chier.
Il est préférable de récupérer les infos 'utiles' et les votants tu peux très bien faire une popup avec requête ajax pour les avoir (il ne sont pas forcément tous nécéssaire).
D'ailleurs vu l'exemple s'il y a 500 votants la mise en page sera moche et l’information totalement inutile.

du coup
select champ1, champ2, 
(select count(1) from commentaires where le prédicat qui va bien) as nb vote
from proposition
join ComptClient using(idClient)
etc
Ensuite pour ce qui est de savoir si le vote est positif ou négatif je suppose que tu as cette info dans la table commentaire et deux subselect règle l'affaire ;)

@+

jointures sql et COUNT

par diice » 26 févr. 2014, 01:15

bonjour,

j'ai un souci de jointure...

j'ai 5 tables :

- Stands (idStand,idCreateurStand...)
- Propositions (idProposition, typeAnnonce, stand, idClient...) <-- cette table est en fait une table de liaison entre ce qui est proposé (listé dans typeAnnonces, et celui qui propose (clients), et ou il propose (stand)
- TypeAnnonces (idType, nom...)
- ComptesClients (idClient,Nom...)
- Commentaire (idComm, idProp, idClient, idStand...) <-- idClient est celui qui commente (pas forcement celui qui a creé la proposition)
- votes (idVote, idProp, idClient, idStand, Vote) <-- idClient est celui qui vote (pas forcement celui qui a creé la proposition) et Vote (enum('1','-1'))

j'aimerai listé toutes les propositions (informations dans typeAnnonces) d'un stand (créé par un client) qui comporterait la somme des commentaires, avec une somme positive et une somme négative des votes (+1 et -1) avec pour chaque type de vote un listing de tous les votants (clients aussi) ...

j'aimerai afficher ce type de ligne, par exemple pour que ce soit plus simple :
  1. -Nom de la proposition 1 (proposé par untel) - X commentaires - 25 votes positifs (à voté : untel1, untel2, untel3...) | 12 votes négatifs (à voté : untel4, untel5, untel6...)
  • -Nom de la proposition 2 (proposé par untel) - X commentaires - 32 votes positifs (à voté : untel10, untel222, untel13...) | 2 votes négatifs (à voté : untel45, untel53, untel65...)
  • -....

=> nom de la proposition est stocké dans TypeAnnonce qui appartient a un stand.
=> un client peut creer un stand, ajouter des propositions a ce stand, voter et commenter
=> tous les autres clients ont acces a ce stand et peuvent proposer, commenter et voter

Si vous avez suivi jusqu'ici (ouf), ne vous inquiétez pas la question est simple :)

je pourrai tres bien faire une premiere requete avec jointure simple sur la proposition et typeannonce et apres dans le while refaire des requeste qui me ramenerai chacune des informations... mais cela me semble lourd et gourmand en ressource surtout si j'ai 150 propositions a lister avec chacune 50 votes et 30 commentaires ! !!

puis-je faire tout ca en une seule requete ?? avec une jointure externe ou interne (j'ai jamais utilisé ça !) ??
et finalement est-ce que cela serait reelement moins gourmand ou je me fais une idée fausse du bouclage de requete...

jusqu'ici j'en suis la :
SELECT P.*, T.*, C.*, COUNT(CM.idCommentaire) as NbComm
FROM propositions P
LEFT OUTER JOIN TypeAnnonces T
ON P.idType = T.idType
LEFT OUTER JOIN Client C
ON P.idClient = C.idClient
LEFT OUTER JOIN Commentaires CM
ON CM.idType=P.idType
WHERE and P.idStand=1 and P.idStand = CM.idStand
et j'ai pas encore inclu les votes !!!

bref cette requete ne m'affiche q'un resultat avec la somme de tous les commentaires de base....
j'ai essayé avec INNER JOIN, c pareil...

si vous pouviez m'aiguiller, me mettre sur la voie (jointure interne, externe ? multi requetes???) je vous en serait bien reconnaissant !!

merci d'avance.... et désolé pour le temps de lecture...