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 :

Compréhension SQL : jointures et "doublons"


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut Compréhension SQL : jointures et "doublons"
    Bonjour,

    Je développe dans le web depuis plusieurs année et me sert du langage SQL régulièrement. J'ai cependant très souvent utilisé les SGBDR de manière simple sans vraiment optimiser au mieux mes requêtes. Celà a cause de mon manque de connaissance dans l'usage avancé des SGBDR.

    Aujourd'hui j'aimerais me débloquer sur la notion que je vais présenter ci-dessous.

    Contexte: Trois table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    element:      [id, name]
    elements_tag: [id, element_id, tag_id]
    tag:          [id, name]
    Lorsque j'effectue cette requête,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT e.id AS eid, e.name AS ename, t.name AS tname
    FROM element e
    LEFT JOIN elements_tag et
      ON e.id = et.element_id 
    LEFT JOIN tag t
      ON t.id = et.tag_id
    disons que mon retour est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    eid    ename    tname
    1    voiture    deplacer
    1    voiture    moteur
    2    velo       deplacer
    3    porte      ouvrir
    3    porte      bois
    4    bureau      poser
    4    bureau      bois
    J'ai bien mes éléments et les tags qui y sont associés. Avec ça je peux hydrater mes objets dans mon programmes.

    Ma question désormais est comment puis-je limiter ma requête a un certains nombre d’éléments et non a un certains nombre de résultats.
    Si je rajoute une LIMIT a ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT e.id AS eid, e.name AS ename, t.name AS tname
    FROM element e
    LEFT JOIN elements_tag et
      ON e.id = et.element_id 
    LEFT JOIN tag t
      ON t.id = et.tag_id
    LIMIT 3
    Je limite mon nombre de résultats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    eid    ename    tname
    1    voiture    deplacer
    1    voiture    moteur
    2    velo       deplacer
    Or mon souhait est de limiter le nombre "d'élément" pour qu'en quelque sorte le résultats ressemble à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    eid    ename    tname
    1    voiture    deplacer
    1    voiture    moteur
    2    velo       deplacer
    3    porte      ouvrir
    3    porte      bois
    (3 e.id différents)

    Est-ce possible en SQL ?

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    Billets dans le blog
    14
    Par défaut
    element: [id, name]
    elements_tag: [id, element_id, tag_id]
    tag: [id, name]
    Déjà, id est inutile dans la deuxième table qui est une table associative. La clé primaire de cette table devrait être composée des identifiants des deux tables associées.

    Or mon souhait est de limiter le nombre "d'élément"
    Si tu veux 3 eid, comme element.id est semble t-il auto-incrémenté (ce qui est une bonne chose), il suffit de demander les eid < 4 mais j'ai l'impression que ce n'est pas vraiment ce que tu souhaites car tu n'aurais toujours que les 3 premiers eid.

    Veux-tu 3 éléments au hasard et tous les tags associés à ces éléments ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Déjà, id est inutile dans la deuxième table qui est une table associative. La clé primaire de cette table devrait être composée des identifiants des deux tables associées.
    Ok

    Citation Envoyé par CinePhil Voir le message
    Veux-tu 3 éléments au hasard et tous les tags associés à ces éléments ?
    Non pas au hasard, je ne l'ai pas mis dans mon exemple mais des filtres peuvent intervenir pour choisir les éléments à récupérer.

    Donc je cherche à récupérer 3 éléments en fonction de critères (par exemple avec un WHERE e.name LIKE 'a%') ainsi que tous les tags associés.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    Billets dans le blog
    14
    Par défaut
    Tu veux dire qu'avec ton LIKE, plus de trois éléments sont susceptibles d'être retournés par la requête et tu ne veux que les trois premiers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT e.id AS eid, e.name AS ename,
    	t.id AS tid, t.name AS tname
    FROM element e
    INNER JOIN element_tag et ON et.element_id = e.id
    	INNER JOIN tag t ON t.id = et.tag_id
    WHERE e.id IN (
    	SELECT id
    	FROM element
    	WHERE name LIKE 'a%'
    	LIMIT 3
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tu veux dire qu'avec ton LIKE, plus de trois éléments sont susceptibles d'être retournés par la requête et tu ne veux que les trois premiers ?
    Exactement. Je suis obligé de passer par une requête imbriquée ?

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    Billets dans le blog
    14
    Par défaut
    Tu peux aussi faire une jointure sur la sous-requête mais en quoi la "requête" imbriquée te pose problème ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

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

Discussions similaires

  1. [Toutes versions] Requête SQL avec Simples et Doubles Quotes
    Par Roums dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/03/2010, 10h00

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