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

Langage SQL Discussion :

Requête SQL optimisée


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut Requête SQL optimisée
    Bonjour,

    Je dispose d'un site avec plusieurs tables dont les suivantes :
    users
    contacts
    groups
    groups_users

    - users contient des informations classiques sur les utilisateurs.
    - contacts contient un champ id_user1 et un champ id_user2, indiquant qui est contact avec qui (il y a réciprocité)
    - groups contient un champ group_name et un champ id_user qui sont le nom du groupe et l'id de l'utilisateur l'ayant créé
    - groups_users contient un champ group_id correspondant à l'id d'un groupe, et id_user correspondant à l'id d'un user dans ce groupe

    Je voudrais faire une requête permettant de récupérer un tableau comprenant tous les groupes d'un utilisateur, ainsi que les contacts qu'il a rajouté dans ses groupes, ainsi que les groupes vides et les contacts qui ne sont pas associés à des groupes.

    Est-il possible de faire ceci en une seule requête ou moins ? Je voudrais faire une requête SQL rapide mais j'ai peur qu'on ne puisse pas faire cela efficacement en SQL... Auriez-vous une idée ? Les jointures externes sont un peu ce que je cherchais mais ne permettent pas de joindre autant de tables.

    La seule solution que je vois est de sélectionner tous les groupes d'un utilisateur, pour chaque groupe de chercher les contacts dans ce groupe, puis de chercher tous les contacts qu'il n'aurait pas mis dans un groupe. Mais cela me semble extrêmement lourd...

    Merci d'avance !

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour
    Citation Envoyé par Shredder Voir le message
    Je voudrais faire une requête permettant de récupérer un tableau comprenant tous les groupes d'un utilisateur, ainsi que les contacts qu'il a rajouté dans ses groupes, ainsi que les groupes vides et les contacts qui ne sont pas associés à des groupes.
    Je ne comprend pas bien ce que vous voulez faire.
    Voulez vous mélanger des groupes et des contacts dans le résultat ?

    Pouvez vous donner un exemple du résultat attendu, ce sera surement plus clair

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de colonnes et de lignes.

    2) Nommez vos tables et colonnes au singulier car elles sont issues des entités types du MCD, elles mêmes issues des règles de gestion qui décrivent ce qui se passe successivement pour 1 instance de chaque entité type.

    Est-il possible de faire ceci en une seule requête ou moins ?
    Ce sera difficile de faire tout ça en une seule requête. Alors en moins d'une requête...

    Donnez un exemple de données et le résultat attendu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    Certes je ne suis pas très clair...
    Voici un exemple :

    Sur le site les utilisateurs peuvent s'ajouter en contact les uns les autres (un peu comme avec un ami sur facebook).
    Mais j'aimerais que les utilisateurs puissent classer leurs contacts dans des groupes de contacts.

    Par exemple supposons qu'un utilisateur appelé Machin ait comme amis : Ami1, Ami2, Ami3, Ami4
    et qu'il ait créé comme groupes d'amis Groupe1 Groupe2 Groupe3.
    Il rajoute Ami1 et Ami2 dans le Groupe1, Ami3 dans le Groupe2, le Groupe3 restant vide, et Ami4 n'étant dans aucun groupe.

    Je voudrais récupérer "l'objet" suivant :

    Groupe1 Ami1
    Groupe1 Ami2
    Groupe2 Ami3
    Groupe3 null
    null Ami4

    Pour pouvoir faire cela au total j'ai une table users, une table amis, une table ami_de, une table groupes et une table dans_groupe (c'est très lourd je pense mais je crois qu'il n'y a pas d'autre solution).

    Voila j'espère avoir été plus clair.
    Le FULL JOIN est en fait exactement ce que je cherche mais visiblement ça n'est pas supporté par MySQL, et je vois donc mal quelle requête utiliser ici.

    Merci !

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table1 FULL JOIN table2 ON condition
    n'est en fait rien d'autre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table1 LEFT JOIN table2 ON condition
    UNION
    table1 RIGHT JOIN table2 ON condition
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Pour le full join, regarde les exemples 15 et 16 :
    http://sqlpro.developpez.com/cours/s...ntures/#L2.4.3

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    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
     
    SELECT 
    		G.nomGroupe
    		,U.nom
    FROM		Groupe G
    LEFT JOIN	group_user GU
    	INNER JOIN Util U
    		ON		U.IdUser = GU.IdUser
    	ON		GU.IdGroupe = G.IdGroupe
    WHERE		G.IdUser = 1
    UNION ALL
    SELECT
    		NULL,
    		U.Nom
    FROM	(
    	SELECT u2 as IdUser
    	FROM	contact
    	WHERE u1 = 1
    	UNION ALL
    	SELECT u1 
    	FROM contact
    	WHERE u2 = 1) AS Ami
    INNER JOIN Util U
    	ON	U.IdUser = Ami.IdUser
    LEFT JOIN group_user GU 
    	ON	GU.IdUser = Ami.IdUser
    WHERE	GU.IdUser IS NULL

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    Ça marche !!! Incroyable

    Merci infiniment pour cette requête aieeeuuuuu, je n'aurais jamais trouvé ça tout seul

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

Discussions similaires

  1. Requête SQL, optimisation
    Par MimiWoOlf dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/06/2014, 03h59
  2. Requête SQL optimisée sur table d'index
    Par mill3d dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 25/08/2010, 12h05
  3. [Requête SQL] Optimisation de plusieurs UPDATE SET FROM
    Par dens19 dans le forum Développement
    Réponses: 6
    Dernier message: 13/03/2009, 16h51
  4. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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