[RESOLU] requete SQL ou DQL pour récupérer valeurs de l'utilisateur en cours et effectuer un calcul

isaac
Invité n'ayant pas de compte PHPfrance

13 juin 2019, 18:55

Hello de retour avec ma demande concernant la requête SQL et mon calcul

alors voila j'ai une table "réponse" qui contient


id -----|------ user_id--------|---- question_id --|------value
1-----------------13-----------------------1-------------------------4
2-----------------13-----------------------2-------------------------3
3-----------------17-----------------------3-------------------------1
4-----------------17-----------------------4-------------------------4

je voudrais faire une requête qui récupére la somme des value de l'user connectée ici on a user avec l'id 13 et l'user avec l'id 17

id 13 = 7 point et id 17 = 5 points

j'avais fais cela
public function getNb($user) {
 
        return $this->createQueryBuilder('R','U')
 
                        ->select('SUM(R.value)')
 
                        ->getQuery()
 
                        ->getSingleScalarResult();
 
    }
cela marche mais me récupere tous les points de la table moi je veux selon l'id conecté car apres je dois faire des calculs genre la somme des 2 premiers choix



EXEMPLE:


choix1:
Je donne régulièrement aux oeuvres de charité.

3
2
1
0

choix:2
J'éprouve beaucoup de plaisir à pouvoir aider quelqu'un en détresse.

3
2
1
0

TOTAL ALT total des valeurs de choix 1 et choix 2


choix3:
Il vaut mieux être pauvre et méconnue mais honnête que d'accepter des compromis pour devenir riche et estimé.

3
2
1
0

choix 4:
Je peux dire très honnêtement que je n'ai jamais cédé à la tentation d'utiliser des moyens douteux pour arriver à un but.

3
2
1
0

TOTAL ETH total des valeurs de choix 3 et choix 4

Je sais que je dois passer par une requete avec jointure mais je sais pas comment faire je suis tres limité en sql dql

Merci a vous

Avatar du membre
Mammouth du PHP | 865 Messages

14 juin 2019, 16:30

Salut isaac, tu n'as pas besoin de faire de jointure.
Avec propriété de jointure $user :
public function getNb($user)
{
  return $this->createQueryBuilder('R')
    ->select('SUM(R.value)')
    ->where('R.user = :user')
    ->setParameter('user', $user)
    ->getQuery()->getSingleScalarResult();
}
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

isaac
Invité n'ayant pas de compte PHPfrance

15 juin 2019, 01:31

Salut Saian du coup j'avais fais cela
public function getQuoi($userslp) {

       return $this->createQueryBuilder('r')
                        ->select('SUM(r.value)')
                        ->join('r.userSlp', 'u')
                        ->where('r.userSlp = :userSlp')
                        ->andWhere('r.question <= 65')
                        ->setParameter('userSlp', $userslp) 
                        ->getQuery()
                        ->getSingleScalarResult();

    };
Ce que je voulais faire c'etais filtrer le resultat par rapport au nombre de questions donc j'ai ajouté un

andwhere( 'r.question <= 65) //ceci pour allez jusque la question 65 ensuite créé une nouvel requête pour allez de 65 a 80 par exemple ainsi de suite...je sais pas si c'est la meilleur solution tu me dira tant que cela fonctionne ..;) mais j'avais essayé de faire cela avec setfirst et set max mais cela fonctionne pas peut tu me dire ou le placer?

Avatar du membre
Mammouth du PHP | 865 Messages

15 juin 2019, 03:22

Je pense comme ça :
return $this->createQueryBuilder('r')
  ->select('SUM(r.value)')
  ->join('r.question', 'q')
  ->where('r.userSlp = :userSlp AND q.id <= 65')
  ->setParameter('userSlp', $userslp)
  ->getQuery()->getSingleScalarResult();
LIMIT (setFirstResult et setMaxResults) ne peut pas fonctionner étant donné que ça sert à définir quelle partie tu veux récupérer des lignes du résultat et que la tu n'as qu'une ligne en retour.

D'ailleurs si r.question <= 65 fonctionne alors ça devrait suffire :
return $this->createQueryBuilder('r')
  ->select('SUM(r.value)')
  ->where('r.userSlp = :userSlp AND r.question <= 65')
  ->setParameter('userSlp', $userslp)
  ->getQuery()->getSingleScalarResult();

En fait ce que tu as fait est très bien du coup. ^^

Les jointures ne sont utiles que si tu veux hydrater tout le result set ou si tu as besoin d'utiliser les colonnes des tables jointes dans ton query builder.

La c'est inutile puisque la requête au final c'est :
SELECT SUM(r.value) FROM reponse r WHERE r.user_id = :id AND r.question_id <= 65
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^