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 incluant deux lignes


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut Requête incluant deux lignes
    Bonjour,

    Je début en SQL et je bloque sur une requête.

    Je vous expose le défit...
    J'ai une table appelée 'attribut':
    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
    ID ID_article Attribut Valeur 
    11 11 Couleur Noir 
    12 11 Taille 36 
    13 12 Couleur Blanc 
    14 12 Taille 36 
    15 13 Couleur Bleu 
    16 13 Taille 36 
    17 14 Couleur Noir 
    18 14 Taille 38 
    19 15 Couleur Blanc 
    20 15 Taille 38 
    21 16 Couleur Noir 
    22 16 Taille 40 
    23 17 Couleur Bleu 
    24 17 Taille 40
    Je voudrais en extraire le champ ID_article qui a l'attribut Couleur=Noir et la Taille=38 (ici la réponse serai ID_article=14)
    J'ai essayé une requête du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM  attribut
    WHERE  
    GROUP BY 'ID_article'
    HAVING `Attribut` =  'Couleur'  AND `Valeur` =  'Noir' AND 
     `Attribut` =  'Taille'  AND `Valeur` =  '40'
    Mais ca ne marche pas GROUP BY me supprime la deuxième occurrence alors que je veux tester que au moins une des deux occurrences réponde positivement.
    Comment je pourrais faire cette requête le plus simplement ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Bonjour,
    Je vois deux solutions:
    Soit une jointure de la table sur elle-meme.
    Soit tu modifies les critères ainsi:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    where (attribut = 'couleur' and valeur = 'noir') or (attribut = 'taille' and valeur = '38')
    ...
    et tu regroupes sur l'id de l'article, en ne gardant que ceux qui apparaissent 2 fois.

    Tatayo.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut
    Merci Tatayo,

    Oui, en regardant l'ID_acticle qui apparait en double ca marche mais ca oblige a faire une boucle qui parcourt le résultat.
    Je me dit que SQL doit pouvoir donner le résultat,en un coup.


    En fait je me dit qu'il faudrait faire un truc du gendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 'ID_article'
    FROM  attribut, attribut
    WHERE  `Attribut` =  'Couleur'  AND `Valeur` =  'Noir' 
    AND `Attribut` =  'Taille'  AND `Valeur` =  '40'

    => comme ca l'on aurait deux colonnes attribut ce qu'il permette de faire le AND facilement.
    Le problème c'est que je ne sait pas comment les distinguer.
    D'ailleurs quand je fait ca j'ai le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1066 - Not unique table/alias: 'attribut'
    Mes différents attributs sont sur des lignes différentes et non des colonnes, ce qui donne toute la difficulté du problème.
    Je ne peux pas les mettre dans des colonnes parce que leur nombre est diffèrent selon les articles...

    Est ce que quelqu'un à d'autre idée ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    En fait ça rejoins ma première solution, la jointure.
    Le message d'erreur indique qu'il faut passer par un alias sur la table:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select *
    from MaTable t1
    inner join MaTable T2 on T1.col1 = t2.col1
    where ...

    Il suffit ensuite de considérer que T1 "concerne" la taille, et T2 la couleur pour trouver quoi mettre dans la clause WHERE.

    Tatayo.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut
    C'est exactement ce que je recherchais !!
    Grand merci Tatayo

    Je vais donc implémenter ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT * 
    FROM attribut t1
    INNER JOIN attribut t2 ON t1.ID_article = t2.ID_article
    WHERE (
    t1.Attribut =  'Couleur'
    AND t1.Valeur =  'Noir'
    )
    AND (
    t2.Attribut =  'Taille'
    AND t2.Valeur =  '40'
    )
    LIMIT 0 , 30
    Encore merci

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

Discussions similaires

  1. Requête regroupant deux lignes sur une colonne
    Par majo59 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/08/2012, 10h05
  2. mettre une requête SQL sur deux lignes
    Par MAMANHOU dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/11/2008, 15h37
  3. Réponses: 5
    Dernier message: 09/01/2005, 19h54
  4. [VB.NET] DataGrid : titre des colonnes sur deux lignes
    Par Lahouari dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/12/2004, 14h44
  5. Deux lignes sur un TButton
    Par bml dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2003, 11h17

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