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 "récursive" sur les résultats de cette même requête


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Requête "récursive" sur les résultats de cette même requête
    Bonjour,
    N'etant pas un expert du SQL, je vais presenter mon besoin avec un exemple simple. Il me semble qu'il s'agit de requetes recursives si j'ai bien compris ce que j 'ai lu jusqu'a maintemaint mais je suis ouvert a toute proposition du moment que cela marche.

    J 'ai donc une table contenant 3 colones :
    - nom
    - email
    - Addresse

    J'ai differentes entrées dans cette table ( disons 50 par ex )
    je souhaiterai trouver TOUS les liens qui existent entre les valeurs de ces 3 colones.
    pour etre plus concret par ex, voici 4 lignes parmis ces 50 :

    Dupont dupont@free.fr 3 rue soleil
    Durand dd@orange.fr 4 rue bidule
    Martin dupont@free.fr 6 rue machin
    Chateau Chateau@aol.com 3 rue soleil

    Au terme de ma( mes requetes ) , je souhaiterai ne voir apparaitre que 3 lignes car

    1 - les emails sont les meme pour Dupont et Martin
    2 - les addresse sont les meme pour Dupont et Chateau

    L'idee est de faire des matchs de "proche en proche" , puisque du coup, je suis capable dans on exemple ci dessus de relier indirectement Chateau avec Martin :
    Martin-> dupont@free.fr de Martin-> dupont@free.fr de Dupont -> 3 rue soleil de Dupont -> 3 rue soleil de Chateau -> Chateau

    Merci d avance !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Citation Envoyé par smalldragoon Voir le message
    Au terme de ma( mes requêtes ) , je souhaiterais ne voir apparaitre que 3 lignes
    Ne conserver que 3 lignes sur les 4, mais lesquelles ? selon quel critère objectif ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonsoir
    les criteres sont le fait d'avoir la meme valeur pour un meme champs :

    Meme Email pour Dupont et Martin par ex

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 378
    Points : 39 860
    Points
    39 860
    Billets dans le blog
    9
    Par défaut
    avec votre jeu d'essai, quel résultat final attendez vous ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bonjour
    je souhaites a la fin avoir affiché

    Dupont dupont@free.fr 3 rue soleil
    Martin dupont@free.fr 6 rue machin
    Chateau Chateau@aol.com 3 rue soleil

    avec par ex une mise en avant des valeur comme dans l image ci dessous.
    Nom : screen.jpg
Affichages : 187
Taille : 15,0 Ko

    Merci

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Tu cherches donc à ne sélectionner que les lignes présentant une correspondance avec une autre au niveau de l'adresse mail ou de l'adresse courrier, alors que le nom diffère.
    Je te propose la requête suivante, qui te renverra toutes ces lignes. Je te laisse t'occuper de la question de la présentation.
    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
    select  src.nom     as  nom
        ,   src.email   as  email
        ,   src.adresse as  adresse
        ,   crs.nom     as  nom_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.adresse as  adresse_corresp
        ,   'email'     as  correspondance
    from    matable src
        inner join
            matable crs
            on  src.nom > crs.nom
            and src.email   = crs.email
    union
    select  src.nom     as  nom
        ,   src.email   as  email
        ,   src.adresse as  adresse
        ,   crs.nom     as  nom_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.adresse as  adresse_corresp
        ,   'adresse'   as  correspondance
    from    matable src
        inner join
            matable crs
            on  src.nom > crs.nom
            and src.adresse = crs.adresse
    ;

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bonjour al1_*24
    Merci pour ta reponse.
    j'avais essayé qqchose dans ce genre, ce qui me fait penser que c est donc plus un probleme de syntaxe
    En ayant remis les bons noms de champs, voici le Statement SQL

    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
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.addresse as  addresse_corresp
        ,   'email'     as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
            and src.email   = crs.email
    union
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  addresse
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
        ,   'addresse'   as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
            and src.address = crs.address LIMIT 0, 25
    MySQL a répondu:
    #1054 - Unknown column 'crs.addresse' in 'field list'
    A priori, il ne tiens pas de compte de l alias cree pour la table plus loin et bloque au debut ( ou alors je me trompe ? ).
    Merci

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Vérifie la ligne 6 de ta requête

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Effectivement ;-) ...
    Du coup, j'ai retente avec mon besoin initial ( a savoir bien plus que 2 champs ) et je pense que c est de la que vient le probleme, c 'est une logique que je ne comprends pas .
    SI par ex je rajoute un champ ( Phone qui contient le numero de telephone ) et que je modifie la requete comme suit :

    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
    45
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
        ,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
        ,	crs.phone   as phone_corresp
        ,   'email'     as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
            and src.email   = crs.email
    union
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
        ,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
        ,	crs.phone   as phone_corresp
        ,   'addresse'   as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
            and src.address = crs.address 
    union	
     
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
        ,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
        ,	crs.phone   as phone_corresp
        ,   'Phone'     as  correspondance
    from    data src
        inner join
            data crs
            on  src.phone > crs.phone
            and src.phone = crs.phone LIMIT 0, 250

    Pour moi , je devrais maintenant avoir des lignes supplementaires qui matchent le numero de telephone present ( NB : j'ai bien verifié que j'avais des numeros communs egalement )
    Mais rien... je pense que le probleme est situé entre ma chaise et le clavier ?
    Merci

  10. #10
    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 smalldragoon Voir le message
    je pense que le probleme est situé entre ma chaise et le clavier ?

    ...et plus précisément, à la ligne 44

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bonjour, ligne 44 effectivement....
    Outre maintenant les problemes de syntaxe, mes requetes fonctionnent . Voici pour ceux qui auraient le meme type de problematique :
    J'ai une premiere requete ci apres qui ne me renvoie un resultat que je si je trouve un des 4 parametres en communs



    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
    45
    46
    47
    48
    49
    50
    51
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
    	,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
    	,	crs.phone   as phone_corresp
        ,   'email'     as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
    		and src.phone > crs.phone
    		and src.address > crs.address
            and src.email   = crs.email
    union
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
    	,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
    	,	crs.phone   as phone_corresp
        ,   'addresse'   as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
    		and src.phone > crs.phone
    		and src.email   > crs.email
            and src.address = crs.address 
    union	
     
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
    	,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
    	,	crs.phone   as phone_corresp
        ,   'Phone'     as  correspondance
    from    data src
        inner join
            data crs
          on  src.name > crs.name
    		and src.phone > crs.phone
    		and src.address > crs.address
            and src.phone   = crs.phone   	LIMIT 0, 250
    Pour mes recherche, je suis un peu plus souple et enleve des criteres ' a "tour de role' ( ici le nom )



    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
    45
    46
    47
    48
    49
    50
     
     
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
    	,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
    	,	crs.phone   as phone_corresp
        ,   'email'     as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
     
            and src.email   = crs.email
    union
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
    	,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
    	,	crs.phone   as phone_corresp
        ,   'addresse'   as  correspondance
    from    data src
        inner join
            data crs
            on  src.name > crs.name
     
            and src.address = crs.address 
    union	
     
    select  src.name     as  name
        ,   src.email   as  email
        ,   src.address as  address
    	,	src.phone   as phone
        ,   crs.name     as  name_corresp  
        ,   crs.email   as  email_corresp
        ,   crs.address as  addresse_corresp
    	,	crs.phone   as phone_corresp
        ,   'Phone'     as  correspondance
    from    data src
        inner join
            data crs
          on  src.name > crs.name
     
            and src.phone   = crs.phone   	LIMIT 0, 250
    Merci encore

Discussions similaires

  1. [AC-2007] requête basée sur les résultats d'un autre requête
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/10/2011, 13h18
  2. requête basé sur les résultats des deux sous requete
    Par karwafmhz dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/06/2011, 00h19
  3. Réponses: 4
    Dernier message: 21/07/2009, 11h37
  4. Requête SQL sur le résultat d'une autre requête
    Par rec82 dans le forum Bases de données
    Réponses: 10
    Dernier message: 12/12/2008, 18h40
  5. Réponses: 3
    Dernier message: 11/01/2006, 19h35

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