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 :

[SQL2] Requête complexe


Sujet :

Langage SQL

  1. #1
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut [SQL2] Requête complexe
    Bonjour,
    je me prend la tête sur une requête, si un pro pouvait m'aider ?

    J'ai une table de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE data
    (
        data_id    INTEGER,
        data_lang  VARCHAR(2),
        data_value VARCHAR(255),
     
        CONSTRAINT data_pk PRIMARY KEY (data_id)
    );
    rempli de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    INSERT INTO data VALUES (1, 'fr', 'AFR');
    INSERT INTO data VALUES (2, 'fr', 'BFR');
    INSERT INTO data VALUES (3, 'fr', 'CFR');
    INSERT INTO data VALUES (4, 'fr', 'DFR');
    INSERT INTO data VALUES (5, 'en', 'AEN');
    INSERT INTO data VALUES (6, 'en', 'BEN');
    INSERT INTO data VALUES (7, 'en', 'CEN');
    INSERT INTO data VALUES (8, 'en', 'DEN');
    INSERT INTO data VALUES (9, 'us', 'AUS');
    INSERT INTO data VALUES (10, 'us', 'BUS');
    INSERT INTO data VALUES (11, 'us', 'CUS');
    INSERT INTO data VALUES (12, 'us', 'DUS1');
    INSERT INTO data VALUES (13, 'us', 'DUS2');
    et une table de liens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE tra
    (
        tra_id       INTEGER,
        tra_data1_id INTEGER,
        tra_data2_id INTEGER,
     
        CONSTRAINT tra_pk PRIMARY KEY (tra_id)
    );
    rempli de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    INSERT INTO tra VALUES (1, 1, 5); 
    INSERT INTO tra VALUES (2, 3, 11);
    INSERT INTO tra VALUES (3, 9, 1);
    INSERT INTO tra VALUES (3, 9, 5);
    INSERT INTO tra VALUES (4, 2, 6);
    INSERT INTO tra VALUES (5, 2, 10);
    INSERT INTO tra VALUES (6, 6, 10);
    INSERT INTO tra VALUES (7, 8, 12);
    INSERT INTO tra VALUES (8, 8, 4);
    INSERT INTO tra VALUES (9, 7, 3);
    INSERT INTO tra VALUES (10, 4, 12);
    INSERT INTO tra VALUES (11, 4, 13);
    Remarque : La relation étant symétrique, le champs (1, 1, 5) serait équivalent à un champs (1, 5, 1)


    Je cherche à écrire une requete de sélection qui me fournit la donnée correspondant à une donnée (data_value) et un autre paramètre (data_lang) :

    'AEN' lorsque je lui passe en paramètre data_value : 'AFR' et data_lang : 'en'
    'AUS' lorsque je lui passe en paramètre data_value : 'AFR' et data_lang : 'us'

    'AFR' lorsque je lui passe en paramètre data_value : 'AEN' et data_lang : 'fr'
    'AUS' lorsque je lui passe en paramètre data_value : 'AEN' et data_lang : 'us'

    Si la correspondance ne peut pas être faite à cause
    - d'un critère non rempli (ex 1)
    - de l'absence de lien de correspondance (ex 2)
    je veut récupérer la donnée passée en paramètre (data_value)

    'AFR' (le paramètre data_value) lorsque je lui passe en paramètre data_value : 'AFR' et data_lang : 'it' (ex 1 : 'it' n'est pas dans la colonne data_lang de la table data)
    'CEN' (le paramètre data_value) lorsque je lui passe en paramètre data_value : 'CEN' et data_lang : 'us' (ex 2 : il n'y a pas de lien CEN/CUS dans la table tra )

    Si la requête me retourne plusieurs valeurs, je n'en veut qu'une, la première par exemple :

    'DUS1' lorsque je lui passe en paramètre data_value: 'DFR' et data_lang : 'us'

    Enfin, dernière exigence : En SQL standard (ou MySQL sinon)

    Je ne vous donne pas les essais que j'ai fait pour ne pas vous polluer l'esprit. Peut être qu'avec un regard neuf ?

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    (
    <div style="margin-left:40px">SELECT D1.data_value AS data_value
    FROM data AS D1
    <div style="margin-left:40px">INNER JOIN tra AS T
    <div style="margin-left:40px">ON D1.id = T.tra_data1_id
    INNER JOIN data_value AS D2
    <div style="margin-left:40px">ON D2.id = T.tra_data2_id</div></div></div>WHERE D2.data_value = '@DATA_VALUE' AND D1.data_lang = '@DATA_LANG'</div>) UNION (
    <div style="margin-left:40px">SELECT D1.data_value AS data_value
    FROM data AS D1
    <div style="margin-left:40px">INNER JOIN tra AS T
    <div style="margin-left:40px">ON D1.id = T.tra_data2_id
    INNER JOIN data_value AS D2
    <div style="margin-left:40px">ON D2.id = T.tra_data1_id</div></div></div>WHERE D2.data_value = '@DATA_VALUE' AND D1.data_lang = '@DATA_LANG'</div>) UNION (
    <div style="margin-left:40px">SELECT '@DATA_VALUE' AS data_value</div>) LIMIT 1
    @DATA_VALUE représente le data_value donné en paramètre et @DATA_LANG le data_lang passé en paramètre...
    normalement c'est du SQL2 Standard...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Merci pour ta réponse, je vais essayer tout ça. Cependant, je crois que le "limit" n'est pas du SQL Standard mais sous mySQL ça devrait fonctionner.

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par benwit
    Merci pour ta réponse, je vais essayer tout ça. Cependant, je crois que le "limit" n'est pas du SQL Standard mais sous mySQL ça devrait fonctionner.
    effectivement, j'ai su que le LIMIT n'était pas standard, j'en suis désolé...

    cependant, il te suffit de ne prendre compte que du premier résultat... c'est un peu du gachis de tout sélectionner pour n'utiliser que le premier résultat... mais je ne vois pas exactement comment faire d'autre...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/01/2004, 10h51
  2. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  3. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  4. Réponses: 5
    Dernier message: 04/08/2003, 21h50
  5. Réponses: 7
    Dernier message: 07/04/2003, 09h35

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