[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 | 951 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 | 951 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 ^^

isaac
Invité n'ayant pas de compte PHPfrance

19 juin 2019, 04:13

Désolé :D mais Comment pourrais-je verifier si les input a été checker? je voudrais afficher la requête que si les 65 premières... questions ont été checker
Parce-que la si la personne répond au question sans allez a la jusque la 65 il obtient quand même un résultat est ce que l'on peut utiliser un truck du genre if(isset($_POST['65]))......ma requête.. en js ou php faisable sur la page en cours mais c'est assez specifique

Avatar du membre
Mammouth du PHP | 951 Messages

19 juin 2019, 11:25

Tu pourrais compter les questions pour savoir si y en a 65. Pas sur que la syntaxe fonctionne mais dans le genre
return $this->createQueryBuilder('r')
  ->select('COUNT(question) AS nbAnswers, SUM(r.value)') AS totValue
  ->where('r.userSlp = :userSlp AND r.question <= 65')
  //->where('r.userSlp = :userSlp AND r.question <= 65 AND nbAnswers = 65')
  ->setParameter('userSlp', $userslp)
  ->getQuery()->getSingleResult();
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

20 juin 2019, 13:31

ok je vais essayer ca.. par contre cette ligne je comprend pas tro
->select('COUNT(question) AS nbAnswers, SUM(r.value)') AS totValue
je dois faire un select COUNT(r.question)? ensuite nbAnswers je le défini comment du coup? #-o

Avatar du membre
Mammouth du PHP | 951 Messages

21 juin 2019, 22:18

C'était mal écris oui ça devait être :
->select('COUNT(r.question) AS nbAnswers, SUM(r.value) AS totValue') 
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

23 juin 2019, 15:22

 public function getQuoi($userslp) {
       return $this->createQueryBuilder('r')              
                        ->select('COUNT(r.question) AS nbQuestion, SUM(r.value) AS totValue')                       
                        ->Where('r.userSlp = :userSlp AND r.question <= 65')
                        ->setParameter('userSlp', $userslp) 
                        ->getQuery()
                        ->getScalarResult();
    }
hello voila ce que me retourne la requete
array:1 [▼
  0 => array:2 [▼
    "nbQuestion" => "10"
    "totValue" => "50"
  ]
]
l'ideale serait de dire tant que "nbQuestion" n'est pas egal a 65 ..j'avais pensé a la fonction SQL du case then mais avec query builder c'est pas possible i me semble

Avatar du membre
Mammouth du PHP | 951 Messages

23 juin 2019, 21:43

Rien ne t’empêches d'ajouter un nbQuestion = 65 dans le where.
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

23 juin 2019, 22:48

Saian figure toi que j'avais essayé et ça me mettais cette erreur



An exception occurred while executing 'SELECT COUNT(r0_.question_id) AS sclr_0, SUM(r0_.value) AS sclr_1 FROM Reponse_thematique r0_ WHERE r0_.user_slp_id = ? AND sclr_0 = 65' with params [13]:

SQLSTATE[42S22]: Column not found: 1054 Champ 'sclr_0' inconnu dans where clause

isaac
Invité n'ayant pas de compte PHPfrance

24 juin 2019, 10:59

en faite il ne reconnais pas le nbQuestion.. quand je le passe dans le where #-o

Avatar du membre
Mammouth du PHP | 951 Messages

24 juin 2019, 12:41

Étrange si c'est une erreur SQL car il me semble qu'il n'y a pas de raison que SQL ne reconnaisse pas un alias déclaré dans le SELECT et utilisé dans le WHERE... à vérifier. Si c'est le DQL qui remonte l'erreur pourquoi pas.

En tout cas tu peux toujours te contenter de vérifier le résultat avec $result = /*...*/->getSingleScalarResult(); if ($result['nbQuestion'] == 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 ^^

isaac
Invité n'ayant pas de compte PHPfrance

25 juin 2019, 15:10

Tout d'abord Merci de ta patiente je sais que suis lourd..

alors ou dois'je faire cette verification?
le $ result je le place ou?
public function getQuoi($userslp) {
       return $this->createQueryBuilder('r')              
                        ->select('COUNT(r.manger) AS nbQuestion, SUM(r.value) AS totValue')                       
                        ->Where('r.userSlp = :userSlp AND r.manger <= 65')
                        ->setParameter('userSlp', $userslp) 
                        ->getQuery()
                        ->getSingleScalarResult();

                         if ($result['nbQuestion'] == 65){

                            //...ici?
                         }
    }
ou alors dans mon controller?

Avatar du membre
Mammouth du PHP | 951 Messages

25 juin 2019, 16:40

Bah tu peux le faire la où tu appelles getQuoi ou dans le getQuoi, c'est comme tu préfères, selon la manière dont tu veux que ça se comporte.

Tu pourrais par exemple faire ça :
public function getQuoi($userslp) {
  $result = $this->createQueryBuilder('r')
    ->select('COUNT(r.manger) AS nbQuestion, SUM(r.value) AS totValue')
    ->Where('r.userSlp = :userSlp AND r.manger <= 65')
    ->setParameter('userSlp', $userslp)
    ->getQuery()
    ->getSingleScalarResult();

  return $result['nbQuestion'] == 65
    ? $result // ou $result['totValue'] si tu veux juste retourner le total
    : null;
}
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 ^^