IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Complexité d'une requête MySQL


Sujet :

Requêtes MySQL

  1. #1
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 402
    Points : 4 837
    Points
    4 837
    Par défaut Complexité d'une requête MySQL
    bonjour,
    j'ai 3 tables mysql user, consultation et relation (voir les images ci-dessous).
    consultation :
    Pièce jointe 351868

    relation :
    Pièce jointe 351872

    user :
    Pièce jointe 351991

    la table relation contient des invitations qui ont été émis (invitation de demande d'ajout dans la liste d'amis, invitation de rejoindre un group...).
    quand un user X invite un user Y,j'insère le id_emeteur de X ET le id_destinataire de Y dans la table relation.
    maintenant quand je sélectionne, le problème est là, par ce que il peut y avoir une invitation avec un id_emeteur qui est différent du mien et qu'elle m’intéresse(l'invitation est envoyée a moi).
    bref la requête que j'ai fait est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT id_user,nom,count(*) as totale,nbr_vu_action FROM `consultation` consult inner join users us 
    		on (consult.type_info!='amitie' and consult.owner_info!=us.id_user) 
    		or (consult.type_info='amitie' and EXISTS(select id_emet from relation where relation.id_relation=consult.id_info 
    			and (relation.id_emet=us.id_user or relation.id_dest=us.id_user))) 
    		left join relation r on consult.type_info='amitie' 
    		and consult.id_info=r.id_relation and (r.id_emet=consult.owner_info or r.id_dest=consult.owner_info) group by us.nom
    est-ce qu'il y a un autre moyen plus optimiser et plus propre que ça, pour arriver au même résultat sans passer par EXISTS dans la requête mysql?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faudrait déjà non dire ce que tu cherches à obtenir.

    Quand je vois des jointures avec des != , je suis un peu perplexe déjà.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 402
    Points : 4 837
    Points
    4 837
    Par défaut
    bonjour,
    je cherche a compter le nombre de notification (y compris les invitations qui ont été envoyées a chacun en tant que destinataire) de chaque utilisateur existant (totale), puis le comparer avec nbr_vu_action.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta requête actuelle part dans tous les sens, il faut décomposer ton problème :

    Est-ce que tu arrives déjà a faire une requête qui liste les notifications ?
    Ensuite la même requête mais avec un comptage ?
    Ensuite ajouter nbr_vu_action ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 402
    Points : 4 837
    Points
    4 837
    Par défaut
    bonsoir,
    oui j'arrive bien a lister les notifications avec une requête simple :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ....
    $req="select * from consultation c 
         inner join relation r 
         on c.id_info=r.id_relation 
             and (c.type_info='amitie' and (r.id_emet=:id or r.id_dest=:id) )
         or (c.owner_info!=:id and c.type_info!='amitie') "
         ."group by c.id_consult order by date_consult desc" ;
    $res=$this->driverBdd->prepare($req);
    $res->execute([':id'=>$o->id_user]);
    le résultat est la suivante :
    Pièce jointe 352317

    ensuite la requête qui compte le nombre de notifications pour chaque user est (après une légère modification par rapport a la requête qui est dans mon premier post, cette requête est exécutée juste après la suppression d'une notification):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $req="SELECT id_user,nom,count(*) as totale,nbr_vu_action FROM `users` us 
    		left join consultation consult 
    		on (consult.type_info!='amitie' and consult.owner_info!=us.id_user) 
    		or (consult.type_info='amitie' 
                	and EXISTS(select id_emet from relation 
    			where relation.id_relation=consult.id_info 
    			and (relation.id_emet=us.id_user or relation.id_dest=us.id_user))) 
    		left join relation r 
    		on consult.type_info='amitie' 
    		and consult.id_info=r.id_relation and (r.id_emet=consult.owner_info or r.id_dest=consult.owner_info) group by us.nom";
    le résultat est :

    Pièce jointe 352321

    j'ai compté tout ça manuellement..., et je me suis assurer que le résultat est correcte.

    en ce qui concerne le nbr_vu_action, je vais essayer de vous expliquer ce qui se passe.
    c'est juste après la suppression d'une notification par son propriétaire que je dois vérifier si jamais un utilisateur a TOUT VU, puis a quitter le site et que le nbr_vu_action sauvegardé dans son champ est plus grand que le nombre réel des notifications existantes, voilà la procédure de la suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    protected function update($o){
    		$req="SELECT id_user,nom,count(*) as totale,nbr_vu_action FROM `users` us 
    		left join consultation consult 
    		on (consult.type_info!='amitie' and consult.owner_info!=us.id_user) 
    		or (consult.type_info='amitie' 
                	and EXISTS(select id_emet from relation 
    						where relation.id_relation=consult.id_info 
    						and (relation.id_emet=us.id_user or relation.id_dest=us.id_user))) 
    		left join relation r 
    		on consult.type_info='amitie' 
    		and consult.id_info=r.id_relation and (r.id_emet=consult.owner_info or r.id_dest=consult.owner_info) group by us.nom";
    		$this->rep["modified"]=[];
    		$res=$this->driverBdd->prepare($req);
    		$res->execute();
    		if($res->rowCount()>0){
    			while($d=$res->fetch(PDO::FETCH_OBJ)){
    				$new_nbr=0;
    				if((int)$d->id_user!=(int)$o->id_user){//exclusion de l emeteur
    					if($d->nbr_vu_action>0){
    						if($d->nbr_vu_action>$d->totale){
    							$new_nbr=(int)($d->totale-sizeof($this->rep['items_removed']));
    						}
    						if($new_nbr>0){			
    							$req1="update users set nbr_vu_action=:nbr where id_user=:id_user";
    							$res1=$this->driverBdd->prepare($req1);
    							$res1->execute([':nbr'=>$new_nbr,':id_user'=>$d->id_user]);
     
    							array_push($this->rep['modified']
    							,['id'=>$d->id_user
    							,'nom'=>$d->nom
    							,'nbr_vu_action'=>$new_nbr
    							,'totale'=>$d->totale]);
    						}
     
    					}
     
     
    				}
     
    			}
    			$res->closeCursor();
    		}
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire une requête Mysql
    Par Xavier dans le forum C++Builder
    Réponses: 5
    Dernier message: 01/02/2007, 17h07
  2. besoin d'aide sur une requête mysql
    Par unmulot dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/07/2006, 13h17
  3. Probleme avec une requête MySQL
    Par Alexlesilex dans le forum Requêtes
    Réponses: 8
    Dernier message: 04/05/2006, 17h48
  4. Intégrer un tableau dans une requête mysql
    Par GarGamel55 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/02/2006, 19h16
  5. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo